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

Тема в разделе "Arduino & Shields", создана пользователем vvr, 14 май 2014.

  1. vvr

    vvr Инженерище

    Записываю и читаю данные с sd карты. Чтение данных с первого байта. А вот с последнего байта до первого прочитать не получается. И библиотеку SD штудировал , и в сети два дня ищу - результата нет. Может кто знает как организовать?
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    Покажите как читаете.
     
  3. vvr

    vvr Инженерище

    Так записываю

    Код (Text):
    File dataFile = SD.open("log.txt", FILE_WRITE);
        if (dataFile)
        {
          dataFile.println(val);
          dataFile.close();
          Serial.println(val);
        }
        else
        {
          Serial.println("error opening log.txt");
        }
    Читаю с первого байта - всё о.к.

    Код (Text):
     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();
        }
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    А задом наперед при помощи seek читать пытаетесь?
     
  5. vvr

    vvr Инженерище

    Пробовал так
    Код (Text):
    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
     
  6. Mitrandir

    Mitrandir Гуру

    Попробуй так:

    Код (Text):
    File dataFile = SD.open("log.txt", FILE_READ);
    unsigned long i;
      if (dataFile)
      {
        Serial.println("log.txt:");
        i = dataFile.size();
        while(i>0)
        {
          dataFile.seek(i--);
          value = dataFile.read();
          Serial.write(value);
          delay (3);
        }
        dataFile.close();
      }
     
    vvr нравится это.
  7. vvr

    vvr Инженерище

    Читает байты с последнего, но цифры наоборот - записано 255 - читает 552. И по достижении первого байта чтение не останавливается, всё снова начинается с последнего.
    Но уже прогресс!
     
  8. Mitrandir

    Mitrandir Гуру

    Осталось понять структуру вашего фаила..
    там триады?
     
  9. vvr

    vvr Инженерище

    Я записываю показания потенциометра (перевёл для простоты в byte). Пишу например
    0
    12
    56
    148
    254
    Хочу получить при чтении
    254
    148
    56
    12
    0
    Сейчас получаю
    log.txt
    452
    841
    65
    21
    0
    log.txt
    и цикл повторяется.
    При чтении с первого читает как надо
    log.txt
    0
    12
    56
    148
    254
    log.txt
    и чтение прекращается
     
  10. Mitrandir

    Mitrandir Гуру

    можно полный текст программы...
    вы код куда в луп или сетап кладете?
     
  11. Mitrandir

    Mitrandir Гуру

    Код (Text):
    // Длина записи, 3 цифры+  символы перевода строки
    //тут надо проверить как ардуино пишет перевод строки
    //\n или \r\n
    //eсли \r\n то 5 иначе 4
    //если перевода строк нет то 3
    #define REC_LEN 5

    void read_reverse()
    {
        unsigned long pos;
        File file = SD.open("log.txt",FILE_READ);
        pos = file.size() - REC_LEN;
        while( pos>=0 )
        {
            file.seek(pos);
            for(int i = 0;i<REC_LEN;i++)
            {
                Serial.write(file.read());  
                delay(3);
            }
          pos -= REC_LEN;    
        }
        file.close();
    }

    void setup()
    {
      read_reverse();
    }

    void loop(){}
     
  12. vvr

    vvr Инженерище

    Что - то весь код не вставляется.
    Записываю и читаю в loop , у меня там кнопки - светики-потенциометры
     
  13. Mitrandir

    Mitrandir Гуру

    ну луп крутится вечно, вот и читает он вечно
     
  14. vvr

    vvr Инженерище

    Понимаю, но чтение с первого байта (сообщение 3) происходит как нужно. Я хочу управлять чтением с карты по нажатию кнопок.
     
  15. vvr

    vvr Инженерище

    Завтра попробую ваш вариант с функцией чтения.
     
  16. geher

    geher Гуру

    Цикл
    while( pos>=0 )
    будет крутиться вечно, поскольку pos в данном случае беззнаковый. Условие цикла всегда будет истинным.
    При вычитании из нуля получается большое значение.
    Полагаю, что между чтениями все-таки происходит некоторая пауза, пока цикл пройдет от этого значения до размера файла.

    Для решения проблемы надо или скорректировать условие завершения или сделать pos типа signed long.
    Также неплохо было бы отрабатывать значение, возвращаемое функцией seek, чтобы засекать выход за границу файла.
     
    Megakoteyka и Mitrandir нравится это.
  17. Mitrandir

    Mitrandir Гуру

    да , ошибся, поспешил
     
  18. Megakoteyka

    Megakoteyka Оракул Модератор

    Это потому что в виде строк записано, а не байтами. Можете писать байты, а не текст, тогда файл займет меньше места и читать его задом наперед будет проще. Иначе придется сперва нарезать текст на строки, а затем строки конвертировать в байты. И при этом учитывать, что строки могут быть разной длины. Текст в данном случае имеет только одно преимущество - можно карту воткнуть в комп и прочитать файл глазами. Если этого делать не предполагается, проще работать с байтами.
     
  19. vvr

    vvr Инженерище

    Уже немного запутался.
    Что хочу сделать
    - записываю показания потенциометра ( изменяю яркость светодиода)
    - при нажатии первой кнопки читаю карту с первого байта и меняю яркость как с потенциометром
    - при нажатии второй кнопки читаю карту с последнего байта и меняю яркость в обратном порядке
    Пока до светиков не дошёл, хочу разобраться с sd картой.
    Записать и прочитать с первого байта вроде получается. Если писать байтами то надо записать вместо dataFile.println(val); dataFile.write(val); ?
     
  20. vvr

    vvr Инженерище

    Попробовал записать так


    File dataFile = SD.open("log.txt", FILE_WRITE);
    if (dataFile)
    {
    dataFile.write(val);
    dataFile.close();
    Serial.println(val);
    }
    else
    {
    Serial.println("error opening log.txt");
    }

    Читаю с последнего байта

    File dataFile = SD.open("log.txt", FILE_READ);
    unsigned long i;
    if (dataFile)
    {
    Serial.println("log.txt:");
    i = dataFile.size();
    while(i>0)
    {
    dataFile.seek(i--);
    value = dataFile.read();
    Serial.write(value);
    delay (3);
    }
    dataFile.close();
    }

    Теперь читает вроде правильно, правда после прочтения цикл не прекращается и при чтении с первого байта в сериале пишется абракодабра