使用网络服务器在 ESP32 上重置看门狗定时器

问题描述 投票:0回答:1

我正在使用 ESP232 开发套件,我正在尝试启动一个接入点,我可以在其中输入 WiFi 数据,然后用于设置 WiFi 网络服务器来控制数据。但每当我输入错误的 wifi 数据时,它就会设置看门狗计时器。当我输入正确的 WiFi 数据时,它会连接并工作。

19:18:44:830 -> Trying to connect...
19:18:45:330 -> Trying to connect...
19:18:45:332 -> debug
19:18:45:333 -> debug4
19:18:50:330 -> E (20302) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
19:18:50:339 -> E (20302) task_wdt:  - async_tcp (CPU 0/1)
19:18:50:343 -> E (20302) task_wdt: Tasks currently running:
19:18:50:347 -> E (20302) task_wdt: CPU 0: IDLE
19:18:50:350 -> E (20302) task_wdt: CPU 1: loopTask
19:18:50:353 -> E (20302) task_wdt: Aborting.
19:18:50:356 -> 
19:18:50:356 -> abort() was called at PC 0x400e8e95 on core 0
19:18:50:360 -> 
19:18:50:360 -> 
19:18:50:361 -> Backtrace: 0x4008389d:0x3ffbec3c |<-CORRUPTED
19:18:50:365 -> 
19:18:50:365 -> 
19:18:50:365 -> 
19:18:50:365 -> 
19:18:50:365 -> ELF file SHA256: 12c7e27a4eeae93f
19:18:50:368 -> 
19:18:50:846 -> Rebooting...
19:18:50:848 -> ets Jul 29 2019 12:21:46

这是我现在使用的代码

void startAPMode() {
    if (apmode == true) {
        WiFi.mode(WIFI_AP_STA);
        WiFi.softAP(apSSID, apPassword);

        apServer.on("/", HTTP_GET, [](AsyncWebServerRequest* request) {
            request->send(200, "text/html", ap_mode_html);
            });

        apServer.on("/setup", HTTP_GET, [](AsyncWebServerRequest* request) {
            if (request->hasParam("ssid") && request->hasParam("password")) {
                String ssid = request->getParam("ssid")->value();
                String password = request->getParam("password")->value();
                WiFi.begin(ssid.c_str(), password.c_str());

                unsigned long startTime = millis();
                bool connectionSuccessful = false;

                while (millis() - startTime < 10000) {
                    esp_task_wdt_reset(); // Reset Watchdog Timer
                    if (WiFi.status() == WL_CONNECTED) {
                        connectionSuccessful = true;
                        break;
                    }
                    delay(500);
                    Serial.println("Versuche zu verbinden...");
                }
                //esp_task_wdt_reset();
                Serial.println("debug");
                if (connectionSuccessful) {
                    IPAddress wifiIP = WiFi.localIP();
                    String response = R"html(
                            <!DOCTYPE html>
                            <html>
                            <head>
                                <title>Verbindung Erfolgreich</title>
                                <style>
                                    html, body { font-family: Arial, sans-serif; margin: 0; padding: 0; display: flex; justify-content: center; align-items: center; flex-direction: column; }
                                    .container { padding: 20px; border: 1px solid #ddd; border-radius: 5px; background-color: #fff; box-shadow: 0 2px 4px rgba(0,0,0,0.1); max-width: 90%; }
                                    .ip-address { font-weight: bold; margin-top: 20px; padding: 10px; background-color: #e9ecef; border-radius: 5px; }
                                </style>
                            </head>
                            <body>
                                <div class='container'>
                                    Verbindung erfolgreich! Bitte diese IP Adresse aufschreiben oder merken. &Uuml;ber diese IP Adresse kann nun immer die Fenstersteuerung aufgerufen werden!
                                    <div class='ip-address'>Die IP Adresse f&uuml;r die Webseite ist: )html" + wifiIP.toString() + R"html(</div>
                                </div>
                            </body>
                            </html>
                            )html";
                    request->send(200, "text/html", response);
                    Serial.println("debug2");
                    setupWiFiAndWebServer();
                    Serial.println("debug3");
                }
                else {
                    esp_task_wdt_reset();
                    Serial.println("debug4");
                    //WiFi.disconnect(); // Optional: trennt die Verbindung, wenn nicht erfolgreich
                    String response = "Connection failed! <a href='/'>Try again</a>";
                    request->send(200, "text/html", response);
                    Serial.println("debug5");
                    startAPMode();
                }
            }
            else {
                esp_task_wdt_reset();
                request->send(200, "text/html", "Missing data! <a href='/'>Back</a>");
                startAPMode();
            }
            });

        apServer.begin();
        Serial.println("AP-Modus Webserver gestartet auf " + WiFi.softAPIP().toString());
    }
}

现在我正在 while 循环中重置看门狗计时器(我认为),它检查连接是否成功。如果我不这样做重置它就会在 while 循环中崩溃。但由于我重置了 WD,它在打印“debug 4”的 else{} 部分崩溃。它在串行监视器上打印“debug 4”,5 秒后崩溃。

它应该写“连接失败”,然后我希望它返回到我可以输入数据的表单。对于缺失数据也是如此。

我知道我一直重置计时器的解决方案也不是解决方案,所以如果您有和其他解决方案,我很高兴听到它们。

所以如果有人能帮助我解决这个问题,我会很高兴! 谢谢!

我输入了错误的 Wifi 数据,它重置了 ESP32,因为它触发了看门狗。我预计它会打印连接失败,但它已重置。

c++ webserver esp32 arduino-esp32 watchdog
1个回答
0
投票

这是许多用户在使用 ESPAsyncTCP 库时常犯的错误之一。我在这里复制了 library 的 README.md 的一部分:

要记住的重要事情

  • 这是完全异步的服务器,因此不在 循环线。
  • 您不能使用 yielddelay 或任何使用 它们在回调中
  • 服务器足够聪明,知道何时该 关闭连接并释放资源
  • 您不能对单个请求发送多个回复
© www.soinside.com 2019 - 2024. All rights reserved.