Чтение SD карты

vvadim
Offline
Зарегистрирован: 23.05.2012

Пока едет кардридер хочу подготовится. С записью на карту вроде понятно, почитал, позадавал вопросы.

Теперь с чтением карты. Каждые 50 мс записываю, допустим, две переменные. При чтении нужно

1. Считывать каждые 50 мс

2. Считывать с первой записи ( допустим при нажатии кнопки 1)

3. Считывать с последней записи ( при нажатии кнопки 2)

С кнопками вопросов нет. Как читать с периодичностью и как читать с последней записи ?

vvadim
Offline
Зарегистрирован: 23.05.2012

Получил кардридер. Записываю переменную на карту и читаю в сериале

File dataFile = SD.open("log.txt", FILE_READ);
    if (dataFile)
    {
      Serial.println("log.txt:");
      while  (dataFile.available() && pos == dataFile.position()) 
      {
        Serial.write(dataFile.read());
        pos = pos +1;
        delay (3);
      }
      dataFile.close();
    } 

Не получается вытащить с карты переменную. Пробую так 

File dataFile = SD.open("log.txt", FILE_READ);
    if (dataFile)
    {
      Serial.println("log.txt:");
      while  (dataFile.available() && pos == dataFile.position()) 
      {       
        value = dataFile.read();
         Serial.println(value);
        pos = pos +1;
        delay (3);
      }
      dataFile.close();
    } 

В сериале двузначные числа  не соответствующие записанным значениям. В чём ошибка?

vvadim
Offline
Зарегистрирован: 23.05.2012

Разобрался, поменял println на write  - всё выводится.

File dataFile = SD.open("log.txt", FILE_READ);
    if (dataFile)
    {
      Serial.println("log.txt:");
      while  (dataFile.available() && pos == dataFile.position()) 
      {       
        value = dataFile.read();
         Serial.write(value);
        pos ++;
        delay (3);
      }
      dataFile.close();
    } 

Теперь другая проблема - не получается читать с последнего байта до первого. Библиотеку почитал, в гугле просидел - как реализовать не знаю. Чувствую, что нужно указатель position() выставить на последний байт, а как?  Может кто сталкивался?

Geronimo
Offline
Зарегистрирован: 06.05.2013

Есть метод size. Вернет размер фаила.

vvadim
Offline
Зарегистрирован: 23.05.2012

Я про него читал. A как применить нигде примеров не нашёл. 

Geronimo
Offline
Зарегистрирован: 06.05.2013

myFile.position(myFile.size()-1);
byte lastByte = myFile.read();

vvadim
Offline
Зарегистрирован: 23.05.2012

На   dataFile.position(dataFile.size() - 1);  ругается 

 no matching function for call to 'File::position(long unsigned int)'

Geronimo
Offline
Зарегистрирован: 06.05.2013

Моя ошбка. вместо position надо использовать seek

vvadim
Offline
Зарегистрирован: 23.05.2012
 File dataFile = SD.open("log.txt", FILE_READ);
    if (dataFile)
    {
      Serial.println("log.txt:");
      while (dataFile.available() )
      {
        dataFile.seek(dataFile.size() - 1);
        value = dataFile.read();
        Serial.write(value);
        delay (3);
      }
      dataFile.close();
    } 

Пробую так - в монитор пишет log.txt , данные не читает

Geronimo
Offline
Зарегистрирован: 06.05.2013

А что в последнем байте?

vvadim
Offline
Зарегистрирован: 23.05.2012

Ничего. После нажатия кнопки на чтение сразу пишет log.txt

Geronimo
Offline
Зарегистрирован: 06.05.2013

Фаил может кончаться служебными символами типа \n или \r. И они не отображаются в консоли.

vvadim
Offline
Зарегистрирован: 23.05.2012

Вот первый вариант (чтение с первого байта) - записал, начал читать log.txt - переменная, после прочтения файла пишет log.txt

 

второй вариант (пытаюсь читать с последнего байта) - при чтении пишет log.txt и всё