简体   繁体   English

ESP32 上网络服务器循环的看门狗定时器错误

[英]Watchdog timer errors for loops for webserver on ESP32

I am using ESP32 CAM module for a line follower robot.我正在将 ESP32 CAM 模块用于线跟随机器人。 And, I am trying to create a webserver with 3 submit push buttons.而且,我正在尝试创建一个带有 3 个提交按钮的网络服务器。 But for now, I just observe the input on serial port and work with only one submit bar.但是现在,我只是观察串口上的输入并且只使用一个提交栏。 These push buttons specifies the PWM value of motors and some constants.这些按钮指定电机的 PWM 值和一些常数。 Here is my code:这是我的代码:

#include "Arduino.h"
#include "WiFi.h"
#include "AsyncTCP.h"
#include "ESPAsyncWebServer.h"


AsyncWebServer server(80);

// Internet ID and Password
const char* ssid = "TURKSAT-KABLONET-BC75-2.4G";
const char* password = "d942d3db";

const char* PARAM_INPUT_1 = "input1";
const char* PARAM_INPUT_2 = "input2";
const char* PARAM_INPUT_3 = "input3";

// HTML web page to handle 3 input fields (input1, input2, input3)
const char index_html[] PROGMEM = R"rawliteral( // Webserver design part
<!DOCTYPE HTML><html><head>
  <title>ESP Input Form</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  </head><body>
  <form action="/get">
    input1: <input type="text" name="input1">
    <input type="submit" value="Submit"> // Submit bar 1
  </form><br>
  <form action="/get">
    input2: <input type="text" name="input2">
    <input type="submit" value="Submit"> // Submit bar 2
  </form><br>
  <form action="/get">
    input3: <input type="text" name="input3">
    <input type="submit" value="Submit"> // Submit bar 3
  </form>
</body></html>)rawliteral";

void notFound(AsyncWebServerRequest *request) {
  request->send(404, "text/plain", "Not found");
}
String inputMessage;
void Setup_to_Loop(String inputMessage); // Prototype of function

void Setup_to_Loop(String inputMessage){ // Function to observe the variable
  while(1){
    Serial.print(inputMessage); // Observe submit bar on serial port of Arduino
    delay(200);
  }
}

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  if (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("WiFi Failed!");
    return;
  }
  Serial.println();
  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());

  // Send web page with input fields to client
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/html", index_html);
  });
// Send a GET request to <ESP_IP>/get?input1=<inputMessage>
  server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) {
    String inputMessage;
    String inputParam;
    // GET input1 value on <ESP_IP>/get?input1=<inputMessage>
    if (request->hasParam(PARAM_INPUT_1)) { // Check for which bar is filled ( bar 1 )
      inputMessage = request->getParam(PARAM_INPUT_1)->value();
      inputParam = PARAM_INPUT_1;
    }
    // GET input2 value on <ESP_IP>/get?input2=<inputMessage>
    else if (request->hasParam(PARAM_INPUT_2)) { // Check for which bar is filled ( bar 2 )
      inputMessage = request->getParam(PARAM_INPUT_2)->value();
      inputParam = PARAM_INPUT_2;
    }
    // GET input3 value on <ESP_IP>/get?input3=<inputMessage>
    else if (request->hasParam(PARAM_INPUT_3)) { // Check for which bar is filled ( bar 3 )
      inputMessage = request->getParam(PARAM_INPUT_3)->value();
      inputParam = PARAM_INPUT_3;
    }
    else {
      inputMessage = "No message sent";
      inputParam = "none";
    }
    Serial.println(inputMessage);
    request->send(200, "text/html", "HTTP GET request sent to your ESP on input field ("
                                     + inputParam + ") with value: " + inputMessage +
                                     "<br><a href=\"/\">Return to Home Page</a>");  // Send the values that were written on submit bars
    Setup_to_Loop(inputMessage);  // Call of function
  });
  server.onNotFound(notFound);
  server.begin();
}
void loop() {
}

The recieved error is:收到的错误是:

(20281) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
E (20281) task_wdt:  - async_tcp (CPU 0/1)
E (20281) task_wdt: Tasks currently running:
E (20281) task_wdt: CPU 0: IDLE0
E (20281) task_wdt: CPU 1: loopTask
E (20281) task_wdt: Aborting.
abort() was called at PC 0x400e5def on core 0

Backtrace: 0x4008efe0:0x3ffbe160 0x4008f211:0x3ffbe180 0x400e5def:0x3ffbe1a0 0x40081a15:0x3ffbe1c0 0x40147e4f:0x3ffbc170 0x400e1c53:0x3ffbc190 0x4008ce7d:0x3ffbc1b0 0x4008af7d:0x3ffbc1d0

Rebooting...

Your function Setup_to_Loop() calls delay() .您的 function Setup_to_Loop()调用delay() It's called from the handler for the "/get" request.它是从"/get"请求的处理程序中调用的。

The ESPAsyncWebServer documentation explicitly states that you must not do this: ESPAsyncWebServer文档明确指出您不能这样做:

You can not use yield or delay or any function that uses them inside the callbacks

I'm not quite sure what you're trying to do with this function and why it's using an infinite loop, but you'll need to rewrite it.我不太确定你想用这个 function 做什么以及为什么它使用无限循环,但你需要重写它。 It should return promptly and not call delay() .它应该立即返回而不是调用delay()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM