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" на последовательной консоли.
Заранее спасибо!
@royalspurs314, 👍1
Обсуждение0
Смотрите также:
- Как читать и записывать EEPROM в ESP8266
- Как сделать выводы Tx и Rx на ESP-8266-01 в выводах GPIO?
- Как навсегда изменить скорость передачи данных ESP8266 (12e)?
- Как заставить 5-вольтовое реле работать с NodeMCU
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
- ESP8266 не подключается к Wi-Fi
- AT-команда не отвечает на последовательный монитор
- Разница между этими двумя платами NodeMCU?
Я должен был упомянуть, что он проходит через все 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