2017-02-04 11 views
1

Я пытаюсь отобразить текст в файле, хранящемся на SD-карте. Я могу прочитать первую строку до второй до последней строки. Однако, когда я пытаюсь прочитать последнюю строку, программа перестает работать, и на ЖК-дисплее отображаются все белые квадраты. Что я здесь делаю неправильно?Arduino SD card прочитал последнюю строку

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

выглядит этот код читает 15 строк, а затем считывает 16 и записывает его на ЖК-дисплее. Поскольку мы не знаем, что находится на этой 16-й строчке, вам будет трудно помочь. Я не вижу в этом ничего смертельно опасного, но вы действительно должны проверять чтение на успех, чтобы вы знали, что, по крайней мере, что-то читали и читали на 'std :: getline'. – user4581301

+0

исправьте меня, если я ошибаюсь. в файле записано 16 строк. от строки 0 до строки 15, что делает 16 строк в целом правильными? – bembe24

+0

, так что скажем, последняя строка написана «20». 20 будет 16-й строкой или номером 15 я прав? – bembe24

ответ

0

Здесь:

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

у вас есть код, который должен читать и печатать, все символы на 16-й строке вашего файл, и остановка когда новая линия знак найден.

Это выглядит приемлемо, но , что еслишестнадцатой линии является не прекращается по \n или \r?

documentation из read() говорит, что эта функция возвращает -1, если данных не имеется. Ясно, что если файл заканчивается без новой строки, это именно то, что произойдет. Итак, теперь вы застряли в цикле, в котором вы читаете -1 бесконечно, но почему вы видите эти белые блоки на экране?

Давайте посмотрим. lcd.print(char) унаследован от class Print, и это contains следующий код:

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 (последний столбец, последняя строка) соответствует полному черному квадрату.

Хорошо, мы почти там, только то, что вы видите белых квадратов, а не черных квадратов. В связи с этим следует отметить, что ваш код continuosly и без любая задержка, печатная продукция на lcd. Так что вполне вероятно, что lcd screen продолжает оставаться обновлен(и его содержимое возможно сдвинуто?), что делает черными блокамибелее чем они на самом деле.


TL; DR Решение:

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

Спасибо вам так много !! Это сработало!! Я все еще был смущен тем, как в коде использовались «\ n» и «\ r». – bembe24

+0

@ bembe24 добро пожаловать –