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

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

  1. Megakoteyka

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

    Чтобы в сериале все было как надо, нужно выводить в него при помощи print, а не write.
    Функция write просто записывает байт как байт. А print предварительно переводит его в строку.

    А чтобы код легко читался и красиво выглядел, следует в Arduino IDE нажать Ctrl+T, а при вставке кода на форум пользоваться тэгом CODE - это 19-я кнопка в редакторе, со знаком "<>".
     
    Tomasina нравится это.
  2. Megakoteyka

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

    Код (Text):
    if(нажалась_кнопка_1)
      ReadSd();
    if(нажалась_кнопка_2)
      ReadSdReverse();
    Тогда будет читаться только один раз по нажатию кнопки.
     
    vvr нравится это.
  3. vvr

    vvr Инженерище

    Движемся дальше. Сейчас с первого байта читается правильно один раз и правильно пишет в сериал.
    С последнего байта читается так - log.txt - 255 и потом что записано, правильно пишет в сериал и не выходит из цикла. Надо подумать об условии выхода из цикла.
    С кнопками у меня пока другой принцип- работа в двух режимах каждой. Попробую по нажатию.
     
  4. Megakoteyka

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

    Попробуйте всю свою задачу расписать в виде псевдокода или нарисовать блок-схему алгоритма. Когда перед глазами что-то есть, обычно становится гораздо проще.
     
    atompost нравится это.
  5. vvr

    vvr Инженерище

    Код (Text):
    if(нажалась_кнопка_1)
      ReadSd();
    if(нажалась_кнопка_2)
      ReadSdReverse();
    Сделал по аналогии - работает, ура!! Теперь попробую свести в один код чтение с первого и с последнего байта по нажатию кнопок
     
  6. vvr

    vvr Инженерище

    Читаю по нажатию кнопок

    Код (Text):
    void read_first()
    {
      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 ++;
          delay (10);
        }
        dataFile.close();
      }
    }
    void read_REV()
    {
      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.println(value);
          delay (10);
        }
        dataFile.close();
      }
    }
    Кнопки

    Код (Text):
    if ( VAL == HIGH )
      {
        read_first();
      }
      if ( VALREV == HIGH )
      {
        read_REV();
      }
    Чтение с последнего байта - log.txt, потом 255, потом что записано. Откуда берётся 255?
    Читает по нажатию кнопки сколько угодно раз.

    Чтение с первого байта - как записано, но читает только один раз.
     
  7. vvr

    vvr Инженерище

    Переписал чтение с первого байта - проблема решилась.
    Код (Text):
    File dataFile = SD.open("log.txt", FILE_READ);
      if (dataFile)
      {
        Serial.println("log.txt:");
        while (dataFile.available())
        {
          value = dataFile.read();
          Serial.println(value);
          delay (10);
        }
        dataFile.close();
      }
    Осталось решить чтение с последнего байта - log.txt, потом 255, потом что записано. Откуда берётся 255?
     
  8. Mitrandir

    Mitrandir Гуру

    Попробуй --i вместо i-- написать

    value у тебя как объявлено? Как безнаковое?
     
  9. vvr

    vvr Инженерище

    byte value
     
  10. Megakoteyka

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

    255 - это 0xFF, оно же -1, оно же EOF, оно же End Of File - символ конца файла.
    Нужно просто переместиться на позицию ближе к началу файла и все будет как надо.
    Код (Text):
    i = dataFile.size() - 1;
    и тогда i будет указывать не на конец файла, а на последний байт, что и требуется.
     
    vvr и Mitrandir нравится это.
  11. vvr

    vvr Инженерище

    Вот спасибки, всё работает. Теперь можно заняться следующим этапом - запись и чтение четырёх переменных. Почитаю про массивы, раньше не сталкивался.
     
  12. snake32

    snake32 Нерд

    Не знаю, обязательно ли записывать на СД побайтово?
    Можно сразу блоком бинарных данных

    Код (Text):
    datafile.write( (const uint8_t *)(&data), sizeof(data)  ); // запись сразу нескольких байт из data
    datafile.read( (uint8_t *)(&data), sizeof(data)  ); // чтение сразу нескольких байт в data
    // при этом data может иметь любой тип данных (int, float, byte, struct)
    Обычно такой подход быстрее чем побайтовый метод
     
    Mitrandir нравится это.
  13. vvr

    vvr Инженерище

    Продолжаются игрища с SD картой. Записывать и читать научился.
    Теперь хочется организовать полную повторяемость записи и чтения с карты.
    Имеется ввиду ,что каждые , допустим , 50 мс записываются данные на карту, а при чтении читаются тоже каждые 50 мс.
    Есть идеи как это осуществить?
     
  14. Unixon

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

    А в чем проблема? Опрашивайте карту в цикле через заданные интервалы времени.
     
  15. vvr

    vvr Инженерище

    Записываю данные
    Код (Text):
    long previousMillis = 0;
    unsigned long currentMillis = millis();
        File dataFile = SD.open("log.txt", FILE_WRITE);
        if(currentMillis - previousMillis > 50) {
        if (dataFile)
        {
          dataFile.write(val);
          dataFile.close();
          Serial.println(val);
        }
        previousMillis = currentMillis;
      }
    Так правильно?
     
  16. Unixon

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

    Это изложение идеи или буквально ваш код?
    По идее все верно, но части кода нужно разнести по разным местам.
     
  17. vvr

    vvr Инженерище

    Это пока идея. А что вы имеете в виду под разнести код по разным местам?
     
  18. Unixon

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

    Ну, например

    Код (Text):
    long previousMillis = 0;

    void setup()
    {
    previousMillis = millis();
    }

    void loop()
    {
    unsigned long currentMillis = millis();
    if(currentMillis - previousMillis > 50)
    {
      File dataFile = SD.open("log.txt", FILE_WRITE);
      if (dataFile)
      {
      dataFile.write(val);
      dataFile.close();
      Serial.println(val);
      }
      previousMillis = currentMillis;
    }
     
    vvr нравится это.
  19. vvr

    vvr Инженерище

    Спасибо. А читать с карты таким же способом?
     
  20. Unixon

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

    read() от write() отличаете? :)