Печать содержимого файла SD - карты на ЖК-дисплее
Это часть моей программы, которая считывает данные из файла, хранящегося на SD-карте, и отображает их на ЖК-экране.
File dataFile = SD.open("1165.txt");
if (dataFile) {
Serial.println("File Opened");
lcd.clear();
delay( 5 ); //LCD-specific M
lcd.setCursor( 0,0 );
while (dataFile.available()) {
Serial.write(dataFile.read());
lcd.write(dataFile.read());
lcd.print(dataFile.read());
}
dataFile.close();
} else {
// если файл не открылся, выведите сообщение об ошибке:
Serial.println("error");
}
Когда я смотрю на последовательный монитор он печатает содержимое этого файла но ни одна из этих команд не печатает то что печатается на последовательном мониторе,
lcd.write(dataFile.read());
lcd.print(dataFile.read());
Есть идеи?
@TP Ap, 👍2
2 ответа
Лучший ответ:
Когда вы вызываете dataFile.read(), указатель на файл расширяется, поэтому вы всегда считываете разные байты в каждом вызове чтения. Представьте файл как книгу со множеством строк: каждый раз, когда вы читаете, вы продвигаете текущую строку, поэтому при нескольких вызовах вы никогда не получаете одни и те же данные. Решение состоит в том, чтобы в настоящее время сохранить последний байт чтения:
while (dataFile.available()) {
char readByte = dataFile.read();
Serial.write(readByte);
lcd.write(readByte);
lcd.print(readByte);
}
У вас есть два вызова для отображения данных на ЖК-дисплее, но будьте осторожны, чтобы второй вызов (печать) мог интерпретировать ваши данные как номер, поэтому просто удалите вызов lcd.print(ReadByte), чтобы убедиться, что он печатает необработанный символ.
Вы также можете реализовать процедуру чтения строки, аналогичную:
void _readLine(File f, char *line)
{
boolean cr_found = false;
int p = 0;
while (f.available()) {
char b = f.read();
if(b!='\r' && b!='\n')
line[p++] = b;
if(b == '\r') cr_found = true;
if((b == '\n') && cr_found) break;
}
line[p] = '\0';
}
И считывайте SD - файл строка за строкой, обрабатывая каждый из них по-своему.
char buffer[32];
while(dataFile.available()) {
_readLine(dataFile, buffer);
// сделать что-нибудь с буфером
}
- Как отправить информацию с сайта на ардуино?
- Как использовать SPI на Arduino?
- Режимы открытия файлов на SD-карте Arduino добавление/перезапись
- Подключение HX711 к трехпроводному датчику нагрузки
- Правильное использование * и & при передаче объектов в методах.
- Как преобразовать код Arduino во встроенный код C/C++
- Кнопка двойного состояния Nextion
- ISO C++ запрещает принимать адрес неквалифицированной или заключенной в скобки нестатической функции-члена для формирования указателя на функцию-член