Проблема с чтением данных из SPIFFS

Тема в разделе "ESP8266, ESP32", создана пользователем chumaty, 3 фев 2019.

  1. chumaty

    chumaty Нуб

    Всем добрый день, в ардуинке не силен, разбираюсь, но не могу найти подводного камня.
    Смысл - прочитать "настройки" из файла.
    Настройки считываются, в консоль все переменные выдаются верно, но если убрать комментарий с String Mport_ = obj["port"]; полую вот такой стек и перезагрузку железяки. Думал не хватает памяти, комментировал другую переменную, все работает. Как только снимаю комментарий с "port" снова ошибка. И да, в loop вызов делается один раз.
    Подскажите куда смотреть и как отдебажить?
    Спасибо.

    Код (Text):
    Exception (3):
    epc1=0x4010010e epc2=0x00000000 epc3=0x00000000 excvaddr=0x40000001 depc=0x00000000

    ctx: cont
    sp: 3ffffca0 end: 3fffffd0 offset: 01a0

    >>>stack>>>
    3ffffe40:  3fff33dc 3fff33cc 3fff338c 40100689
    3ffffe50:  402119e8 00000000 000003e8 0000507f
    3ffffe60:  00000000 00000000 00000000 00000000
    3ffffe70:  00000000 00000000 00000000 00000000
    3ffffe80:  00000000 00000000 00000000 00000000
    3ffffe90:  00000000 00000000 00000000 00000000
    3ffffea0:  3ffefd34 00001f95 00001f95 4010020c
    3ffffeb0:  3fffdad0 00000000 3ffffef8 401006dc
    3ffffec0:  402116f8 00000000 3ffefd84 402103ec
    3ffffed0:  3fffdad0 00000000 3ffefa1c 40210408
    3ffffee0:  3fffdad0 00000000 3ffefa1c 4020973d
    3ffffef0:  ffffffff 3fffc6fc 00000001 3ffefd38
    3fffff00:  00000000 3fffdad0 3ffefd40 00000030
    3fffff10:  00000000 3fffdad0 3ffefd40 00000030
    3fffff20:  00000000 00000000 00000000 00000000
    3fffff30:  00000000 00000000 00000000 00000000
    3fffff40:  00000000 00000000 3ffefd84 4020f33c
    3fffff50:  40208f30 00ffffff 3ffefd84 40210dac
    3fffff60:  40210dc0 3ffefa94 3ffefd84 402095c2
    3fffff70:  40208f30 0104a8c0 40210dc0 40210dac
    3fffff80:  00000000 00000000 00000000 4020f080
    3fffff90:  00002580 0000001c 3ffefd84 3ffefd40
    3fffffa0:  00000000 00000000 00000001 3ffefd40
    3fffffb0:  3fffdad0 00000000 3ffefd38 4020ec3c
    3fffffc0:  feefeffe feefeffe 3ffe862c 40100739
    <<<stack<<<
     

    Код (C++):

    String mqtt_server = "NoServerMQTT";                                                    // Имя сервера MQTT
    String mqtt_port = "9999";                                                                 // Порт для подключения к серверу MQTT
    String mqtt_user = "NoUserMQTT";                                                        // Логин от сервер
    String mqtt_pass = "NoPassMQTT";                                                        // Пароль от сервера
    String mqtt_topic = "NoTopicMQTT";                                                      //Топик для устройства

    ................................

    void readFileMqtt() {                                                                       //читаем mqtt настройки из файла
      bool mqttresult = SPIFFS.begin();
      Serial.println(" Read Mqtt Settings: " + mqttresult);
      File mqttff = SPIFFS.open("/mqtt.txt", "r");                                                  //открываем и читаем настройки
      String mqttinput = "";
      while(mqttff.available()) {
        mqttinput = mqttff.readStringUntil('\n');
      }
      DynamicJsonDocument mqttdoc;
      deserializeJson(mqttdoc, mqttinput);
      JsonObject obj = mqttdoc.as<JsonObject>();
                                                                                                //Забираем
      String Mserver_ = obj["server"];
      //String Mport_ = obj["port"];
      String Muser_ = obj["user"];
      String Mpass_ = obj["pass"];
      String Mtopic_ = obj["topic"];
                                                                                                //Тут такая фиговая магия с преобразованием
      mqtt_server = Mserver_;
      //mqtt_port = Mport_;
      mqtt_user = Muser_;
      mqtt_pass = Mpass_;
      mqtt_topic = Mtopic_;
     
      //Serial.println("mqtt_server: " + mqtt_server);
      //Serial.println("mqtt_port: " + mqtt_port);
      Serial.println("mqtt_user: " + mqtt_user);
      //Serial.println("mqtt_pass: " + mqtt_pass);
      Serial.println("mqtt_topic: " + mqtt_topic);
      mqttff.close();
      SPIFFS.end();
    }

    ........................

    void loop(){
    ......................
    readFileMqtt();
    ......................
    }
     
     
  2. А в файле-то оно есть?
     
  3. chumaty

    chumaty Нуб

    Да, из файла чтение происходит и потом этот коллапс.
     
  4. это не то, что я спросил
     
  5. chumaty

    chumaty Нуб

    Тогда видимо Вы имели ввиду то, что я написал в вопросе "Настройки считываются, в консоль все переменные выдаются верно". Этим я хотел сообщить, что чтение из файла происходит и все данные в файле записываются в переменные, все переменные соответствуют всем записанным данным в файле. Т.е. да, в файле оно есть.
     
  6. как же они выводятся верно, если у вас крашится
     
  7. chumaty

    chumaty Нуб

    Вот так выглядит консолька, если бы я знал как вот так, я бы не задал вопроса, по этому прошу помощи.
    Код (C++):
    10:20:59.772 -> Read Mqtt Settings:
    10:20:59.806 -> mqtt_port: 9124
     
  8. тогда это код не полный
     
  9. chumaty

    chumaty Нуб

    Да, подвела не внимательность, проблемы как таковой и нет, опечатка в функции которая шла после вызова чтения файлов. Вопрос закрыт.
     
  10. При обращении к элементам вы не проверяете на наличие ключа, не вызываете bool JsonObject::containsKey(const char* key) const;
    если ключа нет, получите NULL и код будет крашится.
     
  11. chumaty

    chumaty Нуб

    Спасибо за информацию.