Вывод данных из массива
- Войдите на сайт для отправки комментариев
Пт, 16/05/2014 - 15:56
Записываю показания двух потенциометров на sd карту
String dataString = String(val) + " , " + String(val1); File dataFile = SD.open("log.txt", FILE_WRITE); if (dataFile) { dataFile.println(dataString); dataFile.close(); Serial.println(dataString); }
Читаю массив с карты
File dataFile = SD.open("log.txt", FILE_READ); if (dataFile) { Serial.println("log.txt:"); while (dataFile.available()) { Serial.write(dataFile.read()); } dataFile.close(); }
Как вывести данные из массива?
Во втором вашем коде вы аыводите данные из фаила
Я имел ввиду как получить значения двух переменных, наприме value1 и value2 при чтении
Прочитать строку и расрарсить
где хоть почитать и посмотреть примеры?
Если так хочешь хранить в строковом виде почитай про конечные автоматы. Но я бы для хранения выбрал двоичный формат так проще
Я если честно ни с конечными автоматами ни с двоичным форматом ещё не сталкивался.
Глянул про конечные автоматы - тёмный лес и про работу со строками ничего не нашёл.
Какая то секретная тема (если честно задолбался гуглить - нашёл только на си и др. языках.). Дальше ардуино не лезу, а примеров нет вообще более менее доступных .
Как прочитать строку и вытащить из неё два числа????????????????
Про парсить почитал - везде пишут большой тормоз, не подходит.
Читать строку в String, использовать её indexOf() чтобы получить позицию запятой, потом два раза substr() - вырезать то что до запятой и то что после (это и будут ваши 2 числа). Если нужно перевести в long/int, использовать atol/atoi (не забыть только про нуль терминатор в каждой подстроке).
Нашёл на форуме такой пример
переделал под себя
Работает.
Записываю на sd карту
В сериале пишет как нужно
Читаю по аналогии
Ругается error: 'Str' was not declared in this scope
Пробую читать так
В сериал выводится необычно (для меня)
Вот так выглядят числа 122 и 15
Вот этого куска я не понял:
String string ; // создали пустой объект
string.toCharArray(buffer,11); // скопировали нечто из пустого объекта
Переделал
Теперь в сериал выводятся только последние значения.
strtok возвращает указатель на элемент следующий за разделителем, у вас в s1 возвращается второй элемент, а в s2 вообще беда
Здесь всё нормально. Знаний не хватает. Сделал по подобию
Прошу прощения, прочитал рефайренс по диагонали, strtok работает не так как я написал, а ваш вариант выглядит рабочим
Без карты памяти всё ок, а вот при чтении с карты фигня какая то
На всякий случай, strtok портит содержимое buffer, это я к тому, что если вдруг Вы захотите содержимое buffer использовать после strtok, то будете удивлены содержимым (он заменяет разделитель на '\0'). В данном скетче всё нормально, невлияет.
Кстати, а почему так сложно то, вот тоже самое только без
извратовлишних преобразований:А при чтении с SD у Вас чтение либо в Serial выводится, либо никуда. При чтении нужно считать в буфер, например:
dataFile.read( buffer, 11 );
это если Вы знаете какой длины файл, либо в цикле:
А String Str Вам вообще не нужен, поскольку в этом случае у Вас все данные в buffer.
А как теперь из буфера вытянуть обе переменные?
Пока у меня с sd карты читает нормально то, что записано, с первого до последнего байта только такой код
Получить числа не могу. Сижу в тёмном лесу, мыкаюсь в строки, двоичные коды, буфер (всё впервые) и только шишки на лбу.
Наверно непрограммист сильно в густые дебри полез.
Я в сообщении #17 в последнем исходнике написал, как считать данные в buffer. А дальше воспользуйтесь Вашим же текстом, чтобы разобрать и отобразить:
Пробую так
Проблема вероятно с величиной буфера
Пробую в цикле
какая то ерунда получается.
Как вообще правильно определить величину буфера для записи двух переменных от 0 до 255?
Для переменной от 0 до 255 подойдет byte (uint8_t), у вас объявлен char он принимает значение от -128 до 127, соответственно при значении <-128 и >127 происходит переполнение по знаку.
Вот, функция принимает строку, в которой два числа, разделенные пробелом, и печатает их в сериал...числа от 0 до 255
Читаю
В сериал пишет 0 255
Для переменной от 0 до 255 подойдет byte (uint8_t), у вас объявлен char он принимает значение от -128 до 127, соответственно при значении <-128 и >127 происходит переполнение по знаку.
Замени char на byte - ругается error: initializing argument 1 of 'char* strtok(char*, const char*)'
Покажи пожалуйста содержимое log.txt
log.txt это просто инфострока. А как читает с карты памяти сериал в сообщении #21
В строке 12 в tmpBuffer нужно скопировать то что прочитали из файла. В моем примере туда копируется inBuffer с содержимым "0 255", поэтому вы это и видите.
inBuffer = dataFile.read();
тут несоответствие типов...
vvadim, вы всетаки покажите log.txt. Так будет понятно что и какого размера у вас на входе
Записал
Читаю
vvadim, я имел ввиду реальное содержимое текстового файла, а не то, что в порт выводится
Там ничего нет, только строка log.txt. Это просто взял из примера работы с sd картой. Можно вообще убрать
Проблема с длинной, вы читаете из файла по 10 байт, а записи разной длинны, поэтому и каша на выходе. Есть два решения, либо читать в цикле посимвольно до разделителя \n (перевод строки), либо использовать фиксированную длинну. Первый способ предпочтительнее, т.к. позволит не хранить лишние пробелы и файле.
Всмыле ничего нет? Вы же в коде открываете файл log.txt и читаете из него данные...
Вообще, если уж на то пошло, нечего тут возиться со строками, в файле лучше хранить бинарное (байтовое) представление двух чисел, просто одно за другим, не нужно будет никакого разбора строки и никаих дополнительных символов - разделителей.
У меня нескромный вопрос - как это сделать (записать и прочитать)?
Для записи в фаил два раза используйте функцию write, ей нужно дать ей 2 байта (которые считаны с аналоговых входов) один за другим. Чтение в цикле, пока не -1 (это окончание данных в файле), read два раза подряд в две переменные byte, и их потом напрямую печатаем в сериал без всяких преобразований.
Да, для входов нужно будет сделать маппинг, чтобы изменить диаппазон с 0....1023 в 0...255 (здесть по моему есть это в примере выше)
А где можно хоть примеры посмотреть, если можно ссылку
dataFile.write(val);
dataFile.write(val1);
Как выделить 2 байта?
Примеры так на вскидку даже не знаю где такие есть...все правильно написали, выделять ничего не надо, читаете точно также последовательно, сначала будет первый байт, потом второй, в том же самом порядке. (val и val1 должны быть типа byte)
Попробую
Получилось, ура, вот спасибки!!!!!!!!!!!!!!!!!!!
Теперь более сложная задачка стоит передо мной - прочитать с последнего до первого байта.
Со строками читал так
В сериал всё выводилось, только задом наперёд.
Как теперь сначала прочитать последний байт, потом предыдущий?
В смысле, а зачем нужно читать в обратную сторону ?
Ну задача у меня такая. Пример -потенциометром изменяю яркость светодиода, весь процесс записал на карту памяти. Нажал кнопку - светодиод изменил яркость как записано на карту (допустим увеличил с 0 до максимума), нажал другую кнопку - загорелся на максимуме и потом яркость уменьшилась до 0.
С одним у меня получается, а вот ради двух эту тему и завёл. Вообще то мне надо управлять четырьмя, но думаю, если два осилю, то с четырьмя по аналогии справлюсь.
Не до конца понял задачу...в обратную сторону читать тоже можно, использовать seek, в начале установить его на конец файла минус 2 байта (на начало последней пары значений), прочитать два байта, потом сдвинуть на 4 байта назад (начало предпоследней пары), и так до тех пор, пока он не достигнет 0 (это будет первая пара байт и начало файла), прочитать её и выйти из цикла.
Читаю с конца файла
В сериале
Должно быть 0 234
Сделал так
Теперь читает назад как надо, только не останавливается при достижении первого байта
В цикле сдвигать надо на 2 байта назад, а не на 1...вместо 11 строки напишите вот так
Внешний индекс сдвигать нужно только на 2 байта, а не на 4, ведь вызов read двигает только внутреную позицию в файле, а не i...