读取数据并显示
概述
这一部分本来并不难,想直接做不用记录,但是早上还是做了快半个小时,还是写一下出现的一些问题吧。从sd卡中读取数据已经在上一篇文章中有提及,这里就不多赘述,主要是说一下SSD1306 OLED屏幕的一个函数,display.drawXbm()
开始操作
之前已经把OLED显示做好了,现在再把读出来的数据作为参数传进去就行了,所以先来了解一下这个函数的参数(并非来自官网)
drawXbm(34,14,width,height,testCode)
- 第一个参数和第二个参数分别对应起点的x和y坐标,参考系是默认是左上角开始,而我的0.96寸的OLED屏幕是128*64个像素点的,所以根据这些数据的计算就可以准确得出自己想要绘画的位置了。
- 第三个参数就是宽和高,起点,宽,高,这几个量合起来就可以确定绘画范围
- 最后是绘画的内容,我觉得应该是前四个参数合起来就可以确定元素个数,所以这个内容数组没有要求填写数组大小,我试了一下,用偏大的内存空间也是可以正常显示的
- 所以在使用的时候可以创建一个足够大的数组,每次使用之前用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);
}
这样子问题就解决了!