требуется помощь с кодом

Тема в разделе "Arduino & Shields", создана пользователем vankenshtein, 30 июл 2015.

  1. vankenshtein

    vankenshtein Нерд

    Дело в том что все работает отлично, меню работает, строчки листаются, но при перезагрузке отображаются только первые четыре строчки из файла и перелистывание не работает. Я так понимаю при перезагрузке обнуляется какая то переменная и ее можно записать в 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;
        }
    }

    }
     
  2. vankenshtein

    vankenshtein Нерд

    никто не может помочь?
     
  3. DrProg

    DrProg Вечный нерд

    Время нужно чтобы вникнуть, посмотрю чуть позже.
     
  4. vankenshtein

    vankenshtein Нерд

    Спасибо вам большое
     
  5. Unixon

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

    А если во время сброса контроллера (зажать RESET на время) вытащить и снова вставить SD карту, что-нибудь меняется?
     
  6. vankenshtein

    vankenshtein Нерд

    даже если не вытаскивать карту и нажать резет строки перестают пролистываться
     
  7. Unixon

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

    Разница между первым сбросом при включении и всеми последующими в том, что сама SD карта не обесточивается. Отсюда версия - работа библиотеки SD как-то зависит от внутреннего состояния карты, которое сохраняется при сбросе контроллера, если карту не обесточивать. Проверка гипотезы - обесточить карту во время сброса контроллера (вытащить и поставить снова).
     
  8. vankenshtein

    vankenshtein Нерд

    спасибо за совет,но к сожалению не помогло
     
  9. Unixon

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

    А что показывает отладка? Пусть программа пишет в Serial сообщения по ходу работы.
     
  10. vankenshtein

    vankenshtein Нерд

    что именно выводить в сериал?
     
  11. Unixon

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

    Место выполнения кода. Если программа выполняется не так, как должна, вы это увидите сразу по неверной последовательности сообщений.
     
  12. vankenshtein

    vankenshtein Нерд

    вроде нашел причину, но как разобраться не знаю

    Код (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 всеравно
     
  13. Unixon

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

    Не работает чтение с SD, видимо есть какие-то проблемы внутри библиотеки.
    Если есть интерес - можете навставлять отладки внутрь библиотеки и найти, что там ломается.
     
  14. vankenshtein

    vankenshtein Нерд

    интерес есть, попробую... вот ток сомневаюсь что мозгов хватит
     
  15. vankenshtein

    vankenshtein Нерд

    почему чтание не работает? первые четыре строчки отображаются просто после перезагрузки перестают пролистываться дальше потомучто filestrs[firststr] обнуляется. я конечно может и не прав, вообще половину того что делаю не понимаю((