Arduino SD卡读取最后一行

时间:2017-02-04 08:33:45

标签: c++ arduino

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

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

1 个答案:

答案 0 :(得分:0)

下面:

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

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

看起来可以接受,但 第16行 未被终止 <{1}}或\n 会怎样?

\r的{​​{3}}表示如果没有可用数据,此函数将返回read()。显然,如果文件在没有换行符的情况下结束,那正是将要发生的事情。所以现在你在一个循环中卡住,你无休止地阅读-1,但为什么你在屏幕上看到那些白色块

让我们看看。 -1继承自lcd.print(char)documentation代码如下:

class Print

contains内,size_t Print::print(char c) { return write(c); } 被声明为纯虚方法,这意味着它的实现可以在其子类中找到,在这种情况下Print.h

Print::write(uint8_t)

现在,我们发现编码为inline size_t LiquidCrystal::write(uint8_t value) { send(value, HIGH); return 1; // assume sucess } 的{​​{1}}类型的原始-1被解释为char类型的0xFF。快速浏览下表

LiquidCrystal.cpp

显示255(最后一列,最后一行)对应一个完整的黑色方块。

好的,我们几乎就在那里,只有你看到白色方块而不是黑色方块。在这方面,应该注意你的代码是 continuosly ,并且没有任何延迟,在 lcd 上打印东西。因此 lcd屏幕可能会刷新 (其内容可能会移位?),从而使黑色块< / em>出现更白而不是真实的。

TL; DR解决方案:

255