我正在构建一个项目,其中一部分是 ESP32 上的套接字服务器。抛出此错误的场景如下:一个字符串到达套接字,{CHON}
该字符串被成功处理,ESP32 打开必要的继电器并响应CHON
,之后 Guru Meditation Error: Core 1 panic'ed (InstrFetchProhibited) 为抛出并且 ESP32 重新启动。请告诉我如何处理这个错误。
代码如下所示:
#include <WiFi.h>
#include <Wire.h>
// Определяем максимальное количество клиентов, которые могут подключиться к этому серверу (обычно не более 4)
#define MAX_SRV_CLIENTS 5
// Следующие три определения являются определениями отладки
#define DebugBegin(baud_rate) Serial.begin(baud_rate)
#define DebugPrintln(message) Serial.println(message)
#define DebugPrint(message) Serial.print(message)
#define DebugPrintf(message) Serial.printf(message)
int firstRelay = 5;
int secondRelay = 14;
const char* ssid = "Keenetic-6370";
const char* password = "vxTuT5JT";
// Создаем номер порта сервера 80
WiFiServer server(80);
// Управление клиентами
WiFiClient serverClients[MAX_SRV_CLIENTS];
long pushtime = 0;
void setup()
{
pinMode(firstRelay, OUTPUT);
digitalWrite(firstRelay, HIGH);
pinMode(secondRelay, OUTPUT);
digitalWrite(secondRelay, HIGH);
DebugBegin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
DebugPrint("\nConnecting to ");
DebugPrintln(ssid);
uint8_t i = 0;
while (WiFi.status() != WL_CONNECTED && i++ < 30)
{
DebugPrint(".");
delay(500);
}
if (i == 21)
{
DebugPrint("Could not connect to");
DebugPrintln(ssid);
while (1)
{
delay(500);
}
}
server.begin(); // Запускаем сервер
server.setNoDelay(true); // Отключаем функцию объединения небольших пакетов, без задержки при отправке данных
DebugPrint("Ready! Use 'telnet ");
DebugPrint(WiFi.localIP());
DebugPrintln(" 80' to connect");
pushtime = millis();
}
void loop()
{
uint8_t i;
if (server.hasClient()) // Определяем, поступает ли новый клиентский запрос
{
for (i = 0; i < MAX_SRV_CLIENTS; i++) // Освобождаем старого недействительного или отключенного клиента
{
if (!serverClients[i] || !serverClients[i].connected())
{
if (serverClients[i])
{
serverClients[i].stop();
}
serverClients[i] = server.available(); // Назначаем последнего клиента
DebugPrint("New client: ");
DebugPrintln(i);
break;
}
}
if (i == MAX_SRV_CLIENTS) // Когда максимальное количество подключений достигнуто, подключение необходимо отклонить
{
WiFiClient serverClient = server.available();
serverClient.stop();
DebugPrintln("Connection rejected ");
}
}
for (i = 0; i < MAX_SRV_CLIENTS; i++) // Обнаружение данных, отправленных клиентом
{
if (serverClients[i] && serverClients[i].connected()) {
if (serverClients[i].available())
{
String inString;
while (serverClients[i].available()) //get data from the telnet client and push it to the UART
{
char inChar = serverClients[i].read();
inString += inChar;
delay(5);
if (inChar == '}')
{
inString = "\n" + inString;
if (inString.indexOf("{GLAVIARY}")>0) // свет в навесе
{
digitalWrite(firstRelay, !digitalRead(firstRelay));
}
else if (inString.indexOf("{CHON}")>0) // свет в домике куриц on
{
digitalWrite(secondRelay, LOW);
for (i = 0; i < MAX_SRV_CLIENTS; i++) // Отправляем данные каждому клиенту
{
if (serverClients[i] && serverClients[i].connected())
{
serverClients[i].println("CHON"); // ПРЕДПОЛАГАЕМОЕ МЕСТО ОШИБКИ!!!
delay(5);
}
}
}
else
{
Serial.println("Wrong command");
}
inString = "";
}
}
}
}
}
}