Что вызывает повторную инициализацию моей функции настройки esp8266?
Вот код, который я написал:
#include <stdio.h>
#include <ESP8266WebServer.h>
#define MAX_WIFI_INIT_RETRY 50
#define WIFI_RETRY_DELAY 500
const char* wifi_ssid = "ssid";
const char* wifi_passwd = "password";
ESP8266WebServer http_rest_server(80);
const int numParams = 20;
String params [numParams];
String toString(String my_array[], int size)
{
String string;
for (int i = 0; i < size; i++) {
string = string + ", " + my_array[i];
}
return string;
}
int init_wifi() {
int retries = 0;
Serial.println("Connecting to WiFi AP..........");
WiFi.mode(WIFI_STA);
WiFi.begin(wifi_ssid, wifi_passwd);
// проверьте состояние подключения Wi-Fi, чтобы быть WL_CONNECTED
while ((WiFi.status() != WL_CONNECTED) && (retries < MAX_WIFI_INIT_RETRY)) {
retries++;
delay(WIFI_RETRY_DELAY);
Serial.print("#");
}
return WiFi.status(); // возвращает статус подключения Wi-Fi
}
void readParams(String (& params) [numParams])
{
int mn = WiFi.scanNetworks();
for (int i = 0; i < mn; i++)
{
// Serial.println(WiFi.SSID(i).c_str()); // печатает имена всех точек доступа в последовательном мониторе.
params [i] = WiFi.SSID(i).c_str();
}
}
void listHotspots() {
String results = toString(params, sizeof(params));
Serial.println(results);
http_rest_server.send(200, "text/plain", results);
}
void config_rest_server_routing() {
http_rest_server.on("/", HTTP_GET, []() {
http_rest_server.send(200, "text/html",
"Welcome to the ESP8266 REST Web Server");
});
http_rest_server.on("/hotspots", HTTP_GET, listHotspots);
}
void setup(void) {
Serial.begin(115200);
init_led_resource();
WiFi.mode(WIFI_STA);
WiFi.disconnect();
readParams (params);
if (init_wifi() == WL_CONNECTED) {
Serial.print("Connetted to ");
Serial.print(wifi_ssid);
Serial.print("--- IP: ");
Serial.println(WiFi.localIP());
}
else {
Serial.print("Error connecting to: ");
Serial.println(wifi_ssid);
}
config_rest_server_routing();
http_rest_server.begin();
Serial.println("HTTP REST Server Started");
}
void loop(void) {
http_rest_server.handleClient();
}
когда я получаю доступ к корневому URL-адресу: т.е. 192.168.0.101/
, он отлично открывает корневую страницу, но когда я пытаюсь открыть 192.168.0.101 / hotspots
, он перезагружает ESP8266 до тех пор, пока страница не остановится, чтобы предпринять новые попытки, и я ничего не получаю в результате.
В последовательном мониторе я вижу это исключение, когда пытаюсь зайти на страницу ip / hotspot
.
Exception (9):
epc1=0x4020148a epc2=0x00000000 epc3=0x00000000 excvaddr=0x4d2d5456 depc=0x00000000
>>>stack>>>
ctx: cont
sp: 3ffffde0 end: 3fffffc0 offset: 01a0
3fffff80: 3fffdad0 3ffee553 3ffee5a4 40201347
3fffff90: 402086b8 6505a8c0 feefeffe feefeffe
3fffffa0: 3fffdad0 00000000 3ffee5e0 40206614
3fffffb0: feefeffe feefeffe 3ffe8510 40100479
<<<stack<<<
ets Jan 8 2013,rst cause:4, boot mode:(3,6)
wdt reset
load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v8b899c12
~ld
Connecting to WiFi AP..........
######Connetted to Hometelecom1N5E--- IP: 192.168.0.101
HTTP REST Server Started
что-то не так с функцией toString
?
@Ciasto piekarz, 👍0
Обсуждение1 ответ
Когда программа выходит из строя, вы можете отладить сбой на основе номера фатального исключения.
Exception (9) Unaligned read/write operation addresses
1. Unaligned read/write Cache addresses
2. Wild pointers
Это приводит, как указывает Юрай, к сбросу WD:
rst:4 Hardware WDT reset
Чтобы получить точную часть кода, вставьте >>>stack>>>
в окно декодера espExeption в Arduino. Подробно описано, как установить и использовать.
Мое обоснованное предположение заключается в том, что интенсивное использование String class в сочетании с большим количеством строковых операций с функцией getHotspot приводит к повреждению кучи и сбою Esp8266. Попробуйте определить фиксированные массивы символов и избавиться от класса String, чтобы получить стабильно работающую систему. Опубликуйте результат декодера espExeption в качестве ответа на ваш вопрос, если вы считаете, что что-то еще может быть подозрительным
спасибо @codebreaker007 Мне удалось заставить код работать, не могли бы вы внимательно взглянуть на мой обзор кода на https://codereview.stackexchange.com/q/242917/22943, @Ciasto piekarz
- ESP8266 загружает данные на облачную платформу Google
- Wi-Fi-подключения теряются при сбросе подключения
- Зачем нужно время отклика в AT-командах esp8266?
- ESP8266 не подключается к Wi-Fi
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Можно ли отключить WiFi на ESP8266?
- Как отключить или остановить точку доступа в ESP8266?
- ESP8266 — действительно ли у него по умолчанию плохой радиус действия Wi-Fi?
причина 4 - сброс сторожевого таймера, @Juraj
так что может быть причиной сброса сторожевого таймера?, @Ciasto piekarz
недостаточно долго вызывать функцию, которая «кормит собаку». декодировать трассировку стека, @Juraj
неважно, я понял, что решил свою проблему, @Ciasto piekarz