ESP8266 MP3制作——从sd卡读取数据并显示出来

本文讲述了作者在使用SSD1306 OLED屏幕时遇到的显示问题,数据读取后显示乱码,通过发现换行符差异解决方法,包括修改文件格式和调整代码来适应不同系统换行符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读取数据并显示

概述

这一部分本来并不难,想直接做不用记录,但是早上还是做了快半个小时,还是写一下出现的一些问题吧。从sd卡中读取数据已经在上一篇文章中有提及,这里就不多赘述,主要是说一下SSD1306 OLED屏幕的一个函数,display.drawXbm()

开始操作

之前已经把OLED显示做好了,现在再把读出来的数据作为参数传进去就行了,所以先来了解一下这个函数的参数(并非来自官网)

drawXbm(34,14,width,height,testCode)
  1. 第一个参数和第二个参数分别对应起点的x和y坐标,参考系是默认是左上角开始,而我的0.96寸的OLED屏幕是128*64个像素点的,所以根据这些数据的计算就可以准确得出自己想要绘画的位置了。
  2. 第三个参数就是宽和高,起点,宽,高,这几个量合起来就可以确定绘画范围
  3. 最后是绘画的内容,我觉得应该是前四个参数合起来就可以确定元素个数,所以这个内容数组没有要求填写数组大小,我试了一下,用偏大的内存空间也是可以正常显示的
  4. 所以在使用的时候可以创建一个足够大的数组,每次使用之前用memset或者for循环清空数组(置为0),然后就把读到的数据放进去,要显示下一个图像就把这个清空读下一个即可。

遇到的问题

我把数据读出来,是十进制的数据,结果OLED屏幕显示乱码,我用这串十进制数直接写进PROGMEM,结果显示正常,然后再把我得到的height和width数据输出,结果width居然有一百多
原数据:

24
24

读取代码:

if(myFile.available())
{
  char c1 = myFile.read();
  char c2 = myFile.read();
  char c3 = myFile.read(); //read \n
  Serial.println(int(c3));
  char arr[2] = {c1,c2};
  height = charArr_to_int(arr,2);
}
if(myFile.available())
{
  char c1 = myFile.read();
  char c2 = myFile.read();
  char c3 = myFile.read(); //read \n
  Serial.println(int(c3));
  char arr[2] = {c1,c2};
  width = charArr_to_int(arr,2);
}

看起来没什么问题对吧,先读前两个字符,然后转成十进制数(charArr_to_int函数在上一篇文章《从sd卡读取数据》有代码),接着把换行符读出来,再接着读下一个
但事实不是这样的

解决方案

  • 其实在不同系统对应换行符的处理是不同的,在windows中,换行符是\n\r,而mac和linux中只是\n,我这个txt文件是在windows下创建的,所以换行符不只一个符号,也就导致我把\r当作第一个字符读取出来,然后经过一番处理,就得到那个100多的结果
  • 所以真正的解决方案我想到的有两条,第一个是修改文件格式,比如说改成:
	24#24 //因为我读取数据的时候有处理换行符,所以可以这么做
  • 第二个做法是修改源代码,这是我选择的做法,就是多读一个字符就行了
	int height = 0;
    int width = 0;
    if(myFile.available())
    {
      char c1 = myFile.read();
      char c2 = myFile.read();
      myFile.read(); //read \n
      char c3 = myFile.read(); //read \r
      Serial.println(int(c3));
      char arr[2] = {c1,c2};
      height = charArr_to_int(arr,2);
    }
    if(myFile.available())
    {
      char c1 = myFile.read();
      char c2 = myFile.read();
      myFile.read();  //read \n
      char c3 = myFile.read(); //read \r
      Serial.println(int(c3));
      char arr[2] = {c1,c2};
      width = charArr_to_int(arr,2);
    }

这样子问题就解决了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值