Дело в том что все работает отлично, меню работает, строчки листаются, но при перезагрузке отображаются только первые четыре строчки из файла и перелистывание не работает. Я так понимаю при перезагрузке обнуляется какая то переменная и ее можно записать в eeprom, но что только не пробовал ничего не получается. Помогите пожалуйста Код (Text): #define MAX_STRS 365 int filestrs [MAX_STRS]; // резервируем целых 730 байт. Нужно смотреть за расходом ОЗУ. int firststr=0; // номер первой строки на дисплее int lastfilestr; // количество строк в файле void loop(){ //РЕЖИМ ЧТЕНИЯ if(readbt_state == HIGH && nastrbt_state == LOW){ myFile = SD.open("tir.txt"); if (myFile) { myFile.seek(filestrs[firststr]); char tmpstr[20]; char tmpstrlen=0; while (myFile.available()) { // читаем первую строку tmpstr[tmpstrlen]=myFile.read(); if ((tmpstr[tmpstrlen]=='\n')||(tmpstr[tmpstrlen]=='\r')) break; tmpstrlen++; } lcd.setCursor(0,0); lcd.print(tmpstr); tmpstr[tmpstrlen]=0; while (myFile.available()) { // гоним до следующей строки, пока не пропустим все переводы строки char ch=myFile.read(); if ((ch!='\n')&&(ch!='\r')) break; } tmpstrlen=0; while (myFile.available()) {// читаем вторую строку tmpstr[tmpstrlen]=myFile.read(); if ((tmpstr[tmpstrlen]=='\n')||(tmpstr[tmpstrlen]=='\r')) break; tmpstrlen++; } lcd.setCursor(0,1); lcd.print(tmpstr); tmpstr[tmpstrlen]=0; while (myFile.available()) { // гоним до следующей строки, пока не пропустим все переводы строки char ch=myFile.read(); if ((ch!='\n')&&(ch!='\r')) break; } tmpstrlen=0; while (myFile.available()) {// читаем вторую строку tmpstr[tmpstrlen]=myFile.read(); if ((tmpstr[tmpstrlen]=='\n')||(tmpstr[tmpstrlen]=='\r')) break; tmpstrlen++; } lcd.setCursor(0,2); lcd.print(tmpstr); tmpstr[tmpstrlen]=0; while (myFile.available()) { // гоним до следующей строки, пока не пропустим все переводы строки char ch=myFile.read(); if ((ch!='\n')&&(ch!='\r')) break; } tmpstrlen=0; while (myFile.available()) {// читаем вторую строку tmpstr[tmpstrlen]=myFile.read(); if ((tmpstr[tmpstrlen]=='\n')||(tmpstr[tmpstrlen]=='\r')) break; tmpstrlen++; } lcd.setCursor(0,3); lcd.print(tmpstr); tmpstr[tmpstrlen]=0; myFile.close(); } // обрабатываем кнопки menuup_flag if(output3_1 == LOW && menuup_flag==0) { menuup_flag=1; } if (output3_1 == HIGH && menuup_flag==1) { if (firststr > 0) firststr--; lcd.clear(); menuup_flag=0; } if (output3_2 == LOW && menudown_flag==0) { menudown_flag=1; } if (output3_2 == HIGH && menudown_flag==1) { if (firststr < MAX_STRS-1) firststr++; // если уже стоим на предпоследней строке, дальше двигаться нельзя. menudown_flag=0; lcd.clear(); } } //ЗАПИСЬ БАЗЫ if(outoffbt == LOW && Recflag==0) { Recflag=1; } if(outoffbt == HIGH && Recflag==1){ lcd.clear(); myFile = SD.open("tir.txt", FILE_WRITE); if (myFile) { filestrs[lastfilestr]=myFile.position(); // myFile.print(var); myFile.print("---"); // myFile.print(rtc.getDateStr()); // myFile.print(" "); myFile.print(rtc.getTimeStr()); myFile.print("---"); myFile.print(obsh_nastrel); myFile.print("---"); myFile.println(lastfilestr); lastfilestr++; myFile.close(); Serial.print("Writing to tir.txt..."); Serial.println(); } else { // if the file didn't open, print an error: Serial.println("Error writing "); } // var++; Recflag=0; } } }
А если во время сброса контроллера (зажать RESET на время) вытащить и снова вставить SD карту, что-нибудь меняется?
Разница между первым сбросом при включении и всеми последующими в том, что сама SD карта не обесточивается. Отсюда версия - работа библиотеки SD как-то зависит от внутреннего состояния карты, которое сохраняется при сбросе контроллера, если карту не обесточивать. Проверка гипотезы - обесточить карту во время сброса контроллера (вытащить и поставить снова).
Место выполнения кода. Если программа выполняется не так, как должна, вы это увидите сразу по неверной последовательности сообщений.
вроде нашел причину, но как разобраться не знаю Код (Text): myFile.seek(filestrs[firststr]); Serial.print("filestrs[firststr]_____"); Serial.println(filestrs[firststr]); Serial.print("firststr_____"); Serial.println(firststr); до перезагрузки при нажатии на кнопку + filestrs[firststr]_____16 firststr_____1 filestrs[firststr]_____32 firststr_____2 filestrs[firststr]_____48 firststr_____3 filestrs[firststr]_____64 firststr_____4 после перезагрузки при нажатии на кнопку + filestrs[firststr]_____0 firststr_____1 filestrs[firststr]_____0 firststr_____2 filestrs[firststr]_____0 firststr_____3 filestrs[firststr]_____0 firststr_____4 пробовал сохранить в еепром filestrs[firststr] потом считать, в итоге в сериале 0 всеравно
Не работает чтение с SD, видимо есть какие-то проблемы внутри библиотеки. Если есть интерес - можете навставлять отладки внутрь библиотеки и найти, что там ломается.
почему чтание не работает? первые четыре строчки отображаются просто после перезагрузки перестают пролистываться дальше потомучто filestrs[firststr] обнуляется. я конечно может и не прав, вообще половину того что делаю не понимаю((