Всем доброго времени суток! Прошу помочь, кто понимает, я просто не соображаю немного(много инфы в голове: диплом, все такое, совсем голова забита). Есть файл на сд-карте. Он пополняется при ошибке отправки на сервер определенными строками. Заполнить это не проблема. Но мне еще надо построчно с файла прочитать. Т.к. файл может быть достаточно большим, то мне придется работать без использования переменных, что не подходит, т.к. нереализуемо в моем случае. Остается вариант просто считывать строку с файла в переменную, отправлять, и, в случае успешной отправки удалить эту строку из файла и перейти на следующую, но я не понимаю как это реализовать. Еще раз прошу помощи тех, кто понимает что делать. И прошу прощения, если изложил непонятно. Заранее благодарю за помощь.
Добрый день! Отправка данных на сервер через GET-запрос? Ну тогда есть ограничение в количестве символов. У меня если отправлять данные до 1 кБ - все ок, а если больше ошибка. Отправка производится с помощью GRPS-модуля.
Отправка POST-запросом. Да и там не такие большие данные. С этим проблем нет. Проблема именно в том, что не могу прочитать из файла строку, но уже наткнулся на форум, там почти моя проблема решена. Сейчас попробую.
Вот код примерный с того форума, но проблему не решает. Может что не так написал. Если кто сможет помочь, буду благодарен. Код (C++): #include <dvssdcard.h> #include <SD.h> void setup() { Serial.begin(9600); sdcard.InitializeCard(); delay(100); Serial.println("HARDBASS"); } void loop() { Serial.println("HARDBASS1"); File myFile = SD.open("123.txt"); delay(100); Serial.println("HARDBASS2"); String *stringi; delay(100); Serial.println("HARDBASS3"); char **stroki; delay(100); Serial.println("HARDBASS4"); int st_len = 0; delay(100); Serial.println("HARDBASS5"); if (myFile) { int st = 0, ch = 0; while (myFile.available()) { delay(100); Serial.println("hardbass1"); delay(100); char buff = myFile.read(); Serial.println("hardbass2"); delay(100); stroki[st][ch] = buff; Serial.println("hardbass3"); delay(100); if (buff == ';') // разделитель строки { stroki[st][ch] = 0; Serial.println("hardbass4"); delay(100); st++; Serial.println("hardbass5"); delay(100); st_len++; Serial.println("hardbass6"); delay(100); ch = 0; Serial.println("hardbass7"); delay(100); } else ch++; Serial.println("hardbass8"); delay(100); } myFile.close(); Serial.println("HARDBASS6"); delay(100); } Serial.println("HARDBASS7"); delay(100); for (int i = 0; i < st_len; i++) { for (int j = 0; stroki[i][j] != '\0'; j++) { stringi[i] += stroki[i][j]; } } for (int i = 0; i < st_len; i++) { Serial.println(stringi[i]); } } Хардбасс для отладки
Чем вас не устраивает находить конец строки по символам переноса каретки \r\n? Читаете файл до переноса строки. Пишете в буфер. Буфер отправляете. Как удалять строки я вам подсказать не смогу, т.к. сам не знаю. Но это можно обойти. Попробуйте завести переменную счетчик количества отправленных строк. И от нее пляшите
Вот сделал примерный набросок, все работает. Осталось только либо удалить из файла эти строки, либо придумать что получше, но я пока не могу догнать как и что лучше будет сделать. Прошу помощи. Код (C++): #include <dvssdcard.h> #include <SD.h> void setup() { Serial.begin(9600); sdcard.InitializeCard(); delay(100); Serial.println("HARDBASS"); Serial.println("HARDBASS1"); File myFile = SD.open("123.txt"); Serial.println("HARDBASS2"); String dataString[100]; for (int i = 0; i < 100; i++) { dataString[i] = ""; } int itr = 0; Serial.println("HARDBASS3"); if (myFile) { while (myFile.available()) { Serial.println("hardbass1"); char buf = myFile.read(); if (buf == '\n' || buf == '\r') { if (dataString[itr] != "") { itr++; Serial.println("hardbass2"); } } else { dataString[itr] += buf; Serial.println("hardbass3"); } } } Serial.println("HARDBASS4"); for (int i = 0; i < 100; i++) { if (dataString[i] != "") Serial.println(dataString[i]); } } void loop() { }
Я запутался в этих ваших хардбассах вашем отладочном выводе. Я уже выше говорил. Заведите счетчик, в котором будет хранится количество считанных строк. Потом как надо будет считать новую строку, ищете столько символов переноса строки, сколько у вас в счетчике. Как прочитали нужное, счетчик инкрементировали.
Я уже сделал все, но к сожалению, сейчас не могу выложить код. Использую методы position() и seek() и все работает отлично. Завтра могу скинуть сюда код, если надо.