Печать содержимого файла 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());

Есть идеи?

, 👍2


2 ответа


Лучший ответ:

2

Когда вы вызываете dataFile.read(), указатель на файл расширяется, поэтому вы всегда считываете разные байты в каждом вызове чтения. Представьте файл как книгу со множеством строк: каждый раз, когда вы читаете, вы продвигаете текущую строку, поэтому при нескольких вызовах вы никогда не получаете одни и те же данные. Решение состоит в том, чтобы в настоящее время сохранить последний байт чтения:

while (dataFile.available()) {
  char readByte = dataFile.read();
  Serial.write(readByte);
  lcd.write(readByte);
  lcd.print(readByte);
}

У вас есть два вызова для отображения данных на ЖК-дисплее, но будьте осторожны, чтобы второй вызов (печать) мог интерпретировать ваши данные как номер, поэтому просто удалите вызов lcd.print(ReadByte), чтобы убедиться, что он печатает необработанный символ.

,

1

Вы также можете реализовать процедуру чтения строки, аналогичную:

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);
    // сделать что-нибудь с буфером
}
,