gpt4 book ai didi

c++ - Arduino SD卡读取最后一行

转载 作者:太空宇宙 更新时间:2023-11-04 13:06:31 25 4
gpt4 key购买 nike

我正在尝试显示存储在 SD 卡中的文件中的文本。我可以阅读第一行到第二行到最后一行。但是,当我尝试读取最后一行时,程序停止运行并且 LCD 显示所有白色方 block 。我在这里做错了什么?

myFile.seek(0);
char cr;
for(unsigned int i = 0; i < 15;){
cr = myFile.read();
if(cr == '\n')
{
i++;
}
}
while(true){
cr = myFile.read();
if((cr == '\n')||(cr == '\r'))
break;
lcd.print(cr);
}

这是文件的内容:

1. 00.1
2. SUN
3. 00.00.0001
4. 00:00:01
5. 00.2
6. MON
7. 00.00.0002
8. 00:00:02
9. 00.3
10. WED
11. 00.00.0003
12. 00:00:03
13. 00.4
14. THU
15. 00.00.0004
16. 00:00:04

最佳答案

这里:

  while(true){
cr = myFile.read();
if((cr == '\n')||(cr == '\r'))
break;
lcd.print(cr);
}

您有一些代码应该读取和打印文件第 16 行的所有字符,并在找到换行符停止

它看起来可以接受,但是如果 第 16 行 未终止 \n\r ?

documentation read() 表示如果没有可用数据,此函数将返回 -1。显然,如果文件结尾没有换行符,这正是将要发生的情况。所以现在您陷入一个循环中,您在循环中无休止地读取-1,但是为什么您会在屏幕上看到那些白色 block

让我们看看。 lcd.print(char) 继承自 class Printcontains以下代码:

size_t Print::print(char c)
{
return write(c);
}

内部Print.h , Print::write(uint8_t) 被声明为一个纯虚方法,这意味着它的实现可以在它的一个子类中找到,在这种情况下LiquidCrystal.cpp :

inline size_t LiquidCrystal::write(uint8_t value) {
send(value, HIGH);
return 1; // assume sucess
}

现在,我们发现原来的-1类型char,编码为0xFF,被解释为 255 uint8_t 类型。快速浏览下表

enter image description here

显示 255(最后一列,最后一行)对应于一个全黑方 block 。

好的,我们快到了,只是您看到的是白色方 block 而不是黑色方 block 。在这方面,应该注意您的代码是连续,并且没有任何延迟,在lcd 上打印内容。所以很可能 lcd 屏幕一直在刷新 (并且它的内容可能移动了?),从而使黑 block 看起来比实际情况更白


TL;DR 解决方案:

  while(true){
cr = myFile.read();
if((cr == '\n')||(cr == '\r') || (cr < 0))
break;
lcd.print(cr);
}

关于c++ - Arduino SD卡读取最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42038243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com