Что вызывает повторную инициализацию моей функции настройки esp8266?

esp8266 programming wifi cpp arduino-setup

Вот код, который я написал:

#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 ?

, 👍0

Обсуждение

причина 4 - сброс сторожевого таймера, @Juraj

так что может быть причиной сброса сторожевого таймера?, @Ciasto piekarz

недостаточно долго вызывать функцию, которая «кормит собаку». декодировать трассировку стека, @Juraj

неважно, я понял, что решил свою проблему, @Ciasto piekarz


1 ответ


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