ESP8266 повторный сбой при извлечении информации JSON

Я пытаюсь создать простое жидкокристаллическое устройство, которое извлекает отсюда случайный вопрос об опасности: http://jservice.io/api/randomзатем циклически перебирает категорию/значение, подсказку и правильный вопрос одним нажатием кнопки. Однако я сталкиваюсь с проблемами, когда дергаю за ключ. Я запускаю это на AdaFruit Feather Huzzah esp8266, но плата неоднократно выходит из строя, прежде чем вернуть функцию GetJeopardy. В частности, я получаю такие ошибки:

--------------- ВЫРЕЗАТЬ ЗДЕСЬ ДЛЯ ДЕКОДЕРА ИСКЛЮЧЕНИЙ ---------------

 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 3584, room 16 
tail 0
chksum 0xb0
csum 0xb0
v2843a5ac
~ld

Функция заключается в следующем:


typedef struct {
  const char* cat;
  int val;
  const char* clue;
  const char* corr;
} jeop_problem;


jeop_problem GetJeopardy(){
  jeop_problem JQ;
  const size_t bufferSize = JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(3) +
                            JSON_OBJECT_SIZE(5) + JSON_OBJECT_SIZE(8) + 370;
  DynamicJsonDocument doc(bufferSize);
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("Pulling Jeopardy");
    HTTPClient http; // Объект класса HttpClient
    WiFiClient client;
    http.begin(client, "http://jservice.io/api/random");
    int httpCode = http.GET();
    deserializeJson(doc, http.getString());
    http.end(); // Close connection
    const char* cat = doc[0]["category"]["title"];
    JQ.cat = cat;
    Serial.println(cat);
    int val = doc[0]["value"];
    JQ.val = val;
    Serial.println(val);
    const char* clue = doc[0]["question"];
    JQ.clue = clue;
    Serial.println(clue);
    const char* corr = doc[0]["answer"];
    JQ.corr = corr;
    Serial.println(corr);
  }
  else {
    //  У нас нет соединения, возвращаем пустую проблему
    JQ = {"ERROR: RESET", -1, "ERROR: RESET",
                                    "ERROR: RESET"};
  }
  Serial.println("Pulled Jeopardy!");
  return JQ;
}

В частности, плата всегда дает сбой перед печатью "Pulled Jeopardy" на последовательной консоли.

Заранее спасибо!

, 👍1

Обсуждение

Я должен был упомянуть, что он проходит через все Serial.println(corr); но не попадает в Serial.println("Вытащил Jeopardy").;, @royalspurs314

Чтобы убедиться, что кто-либо из них был достигнут, вам потребуется следующий вызов". flush ()". В противном случае он может выйти из строя/сбросить сразу после этого, и вы не заметите разницы. Иными словами, без .flush() после Serial.println("Вытащил Jeopardy"); вы не можете быть так уверены, что он на самом деле не дошел до этой строки., @timemage

Я не знаю, как ваш код связан с вашим [сброс cause](https://www.espressif.com/sites/default/files/documentation/esp8266_reset_causes_and_common_fatal_exception_causes_en.pdf). Вполне возможно, что это вовсе не так. Но до тех пор, пока вы предоставляете информацию о том, где она висит, она может быть как можно более точной., @timemage

ответы превышают 1 КБ, как это поместится в такой маленький буфер? попробуйте буфер объемом 4 КБ (здесь у вас 8266, а не UNO ;) ), @dandavis

У меня была такая же проблема, вызванная определением StaticJsonDocument<200> jsonDoc внутри функции. Когда я переместил определение как глобальную переменную (из функции), проблема была решена. Я бы предложил попробовать переместить DynamicJsonDocument doc(bufferSize) из функции., @Max