Arduino прочитал последнюю строчку с SD-карты - PullRequest
0 голосов
/ 26 июня 2018

Я довольно новичок в бизнесе Arduino. Как мне прочитать последнюю строку с SD-карты? С помощью следующего фрагмента кода я могу прочитать первую строку (все символы перед "\ n"). Теперь я хотел бы включить «обратное» утверждение (или что-то в этом роде).

Пока мой код:

#include <SD.h>
#include <SPI.h>

File SD_File;

int pinCS = 10;

char cr;


void setup() {
  Serial.begin(9600);
  SD.begin();

  SD_File = SD.open("test.txt", FILE_WRITE);  
  SD_File.println("hello");
  SD_File.close();

  SD_File = SD.open("test.txt");
  while(true){
    cr = SD_File.read();
    if((cr == '\n') && ("LAST LINE?"))
        break;
    Serial.print(cr);
    }
  SD_File.close();

}

void loop() {

}

Ваша помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Я не уверен, что понял ваш вопрос.

  • «Как реализовать seekg Нет seekg. Существует, однако, seek.
  • Этот является страницей документации для библиотеки SD. В правой части страницы находится список всех методов класса File (среди прочих seek).
  • «Как прочитать последнюю строку ...» В вашем коде нет чтения строки. Если вы просто хотите перейти к концу файла, используйте: SD_File.seek( SD_File.size() ); Если вы хотите прочитать последнюю строку, самый простой способ - написать функцию getline и прочитать весь файл построчно до конца. Предполагая, что MAX_LINE достаточно достаточно и getline возвращает ноль в случае успеха:

//...
char s[ MAX_LINE ];
while ( getline( f, s, MAX_LINE , '\n' ) == 0 )
  ;

// when reaching this point, s contains the last line
Serial.print( "This is the last line: " );
Serial.print( s );

Вот идея getline (без гарантии - не проверено):

/*
  s     - destination
  count - maximum number of characters to write to s, including the null terminator. If 
          the limit is reached, it returns -2.
  delim - delimiting character ('\n' in your case)

  returns:
     0 - no error
    -1 - eof reached
    -2 - full buffer
*/
int getline( File& f, char* s, int count, char delim )
{
  int ccount = 0;
  int result = 0;
  if ( 0 < count )
    while ( 1 )
    {
      char c = f.peek();
      if ( c == -1 )
      {
        f.read(); // extract
        result = -1;
        break;  // eof reached
      }
      else if ( c == delim )
      {
        f.read(); // extract
        ++ccount;
        break; // eol reached
      }
      else if ( --count <= 0 )
      {
        result = -2;
        break; // end of buffer reached
      }
      else
      {
        f.read(); // extract
        *s++ = c;
        ++ccount;
      }
    }

  *s = '\0'; // end of string
  return ccount == 0 ? -1 : result;
}
0 голосов
/ 26 июня 2018

Поскольку вы технически открываете текстовые файлы, вы можете использовать seekg, чтобы перейти к концу файла и прочитать последнюю строку, как описано в этом ответе .

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

...