ESP32 上网络服务器循环的看门狗计时器错误
Watchdog timer errors for loops for webserver on ESP32
我正在为巡线机器人使用 ESP32 CAM 模块。而且,我正在尝试创建一个带有 3 个提交按钮的网络服务器。但是现在,我只是观察串行端口上的输入,并且只使用一个提交栏。这些按钮指定电机的 PWM 值和一些常数。这是我的代码:
#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() {
}
收到的错误是:
(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...
您的函数 Setup_to_Loop()
调用 delay()
。它是从 "/get"
请求的处理程序中调用的。
你不可以这样做的ESPAsyncWebServer
documentation explicitly states:
You can not use yield or delay or any function that uses them inside the callbacks
我不太清楚你想用这个函数做什么以及为什么它使用无限循环,但你需要重写它。它应该 return 及时而不是调用 delay()
.
我正在为巡线机器人使用 ESP32 CAM 模块。而且,我正在尝试创建一个带有 3 个提交按钮的网络服务器。但是现在,我只是观察串行端口上的输入,并且只使用一个提交栏。这些按钮指定电机的 PWM 值和一些常数。这是我的代码:
#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() {
}
收到的错误是:
(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...
您的函数 Setup_to_Loop()
调用 delay()
。它是从 "/get"
请求的处理程序中调用的。
你不可以这样做的ESPAsyncWebServer
documentation explicitly states:
You can not use yield or delay or any function that uses them inside the callbacks
我不太清楚你想用这个函数做什么以及为什么它使用无限循环,但你需要重写它。它应该 return 及时而不是调用 delay()
.