Чтобы в сериале все было как надо, нужно выводить в него при помощи print, а не write. Функция write просто записывает байт как байт. А print предварительно переводит его в строку. А чтобы код легко читался и красиво выглядел, следует в Arduino IDE нажать Ctrl+T, а при вставке кода на форум пользоваться тэгом CODE - это 19-я кнопка в редакторе, со знаком "<>".
Код (Text): if(нажалась_кнопка_1) ReadSd(); if(нажалась_кнопка_2) ReadSdReverse(); Тогда будет читаться только один раз по нажатию кнопки.
Движемся дальше. Сейчас с первого байта читается правильно один раз и правильно пишет в сериал. С последнего байта читается так - log.txt - 255 и потом что записано, правильно пишет в сериал и не выходит из цикла. Надо подумать об условии выхода из цикла. С кнопками у меня пока другой принцип- работа в двух режимах каждой. Попробую по нажатию.
Попробуйте всю свою задачу расписать в виде псевдокода или нарисовать блок-схему алгоритма. Когда перед глазами что-то есть, обычно становится гораздо проще.
Код (Text): if(нажалась_кнопка_1) ReadSd(); if(нажалась_кнопка_2) ReadSdReverse(); Сделал по аналогии - работает, ура!! Теперь попробую свести в один код чтение с первого и с последнего байта по нажатию кнопок
Читаю по нажатию кнопок Код (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? Читает по нажатию кнопки сколько угодно раз. Чтение с первого байта - как записано, но читает только один раз.
Переписал чтение с первого байта - проблема решилась. Код (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?
255 - это 0xFF, оно же -1, оно же EOF, оно же End Of File - символ конца файла. Нужно просто переместиться на позицию ближе к началу файла и все будет как надо. Код (Text): i = dataFile.size() - 1; и тогда i будет указывать не на конец файла, а на последний байт, что и требуется.
Вот спасибки, всё работает. Теперь можно заняться следующим этапом - запись и чтение четырёх переменных. Почитаю про массивы, раньше не сталкивался.
Не знаю, обязательно ли записывать на СД побайтово? Можно сразу блоком бинарных данных Код (Text): datafile.write( (const uint8_t *)(&data), sizeof(data) ); // запись сразу нескольких байт из data datafile.read( (uint8_t *)(&data), sizeof(data) ); // чтение сразу нескольких байт в data // при этом data может иметь любой тип данных (int, float, byte, struct) Обычно такой подход быстрее чем побайтовый метод
Продолжаются игрища с SD картой. Записывать и читать научился. Теперь хочется организовать полную повторяемость записи и чтения с карты. Имеется ввиду ,что каждые , допустим , 50 мс записываются данные на карту, а при чтении читаются тоже каждые 50 мс. Есть идеи как это осуществить?
Записываю данные Код (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; } Так правильно?
Это изложение идеи или буквально ваш код? По идее все верно, но части кода нужно разнести по разным местам.
Ну, например Код (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; }