Reset ESP8266 rst cause:2, boot mode:(3,7)

Buenos días, estoy usando una ESP8266 NodeMCU.
Mi código recibe un mensaje de un celular conectado al Wifi de las ESP8266. Está lee un infrarrojo y genera una respuesta que luego devuelve al celular.
Tengo el problema que a veces genera la respuesta y la envía sin problemas y otras veces algo falla y se reinicia la ESP.

código de Error:

⸮C!*⸮́Jan  8 2013,rst cause:2, boot mode:(3,7)
0x4010f000
tail 8
chksum 0x2d
csum 0x2d
v09f0c112
~ld
#include<ESP8266WiFi.h>

const char* ssid = "ESPtelnet";
const char* password = "qwerty123";

unsigned carac = 0;
char txt;
int numero = 0;
int k;
int encontrado = 0;
String cadena = "";
String resp = "";

WiFiServer server(80);

void setup() {
   Serial.begin(2400, SERIAL_7E1);
   delay(10);

   WiFi.mode(WIFI_AP);
   WiFi.softAP(ssid, password, 1, false);
  
   server.begin();
}

void loop() {
  // Check of client has connected
  WiFiClient client = server.available();
  if(!client) {
    return;
  }
  
  // Read the request line
  String request = client.readStringUntil('$');
  // Match request
  if(request.indexOf("Prueba") != -1) {
    resp = leerIR();
  }
 
  client.flush();

  // Send the response to the client
  client.println(resp);
  delay(1);
}

String leerIR(){
  encontrado = 0;
  cadena = "";
  if(Serial.available()>0){
    while(Serial.available() > 0){
      carac = Serial.read();
    }
    
    while(encontrado == 0){
      carac = Serial.read();
      txt = carac;
      if(txt == 'O'){
        do{
          cadena = cadena + txt;
          numero = numero + 1;
          while(Serial.available() <= 0){}
          carac = Serial.read();
          txt = carac;
        }while(numero < 274);
        encontrado = 1;
      }
    }
  }
  Serial.print(cadena);
  return cadena;
}

El código de error que mencionas es un reset del watchdog por seguramente usar loops largos o que no le devuelven el control al loop principal.
Tal vez sea este

 do{
          cadena = cadena + txt;
          numero = numero + 1;
          while(Serial.available() <= 0){}
          carac = Serial.read();
          txt = carac;
        }while(numero < 274);

ya que se queda esperando 274 iteracciones y depende de recibirlas, si no las recibe es como que el ESP8266 dice "Eyyy estoy colgado, reseteo para recuperar el control!!"
Tienes que hacer esos while y do while mas veloces

Sea como fuere, si usas esp32 o esp8266 te recomiendo que mires este post:

Saludos

Si, era un problema con el WatchDog.
Lo solucione poniendo esto en el Setup()
ESP.wdtDisable();
ESP.wdtEnable(WDTO_8S);
y dándole mas tiempo en el bucle con esto
ESP.wdtFeed();
Gracias por las respuestas.

De igual modo cuando ocurra algo similar, usa millis() para metir el tiempo que un loop o una rutina demora en ejecutarse.
Mirando lo que has puesto 8 segundos me parece una barbaridad de tiempo y solo justifica lo que te escribí antes, es decir, tu rutina Serial demora demasiado, tiene que ser más veloz y devolver el control al loop.

Ya leo que lo has arreglado pero te paso unas recomendaciones y dudas.

void loop() {
  // Check of client has connected
  WiFiClient client = server.available();
  if(!client) {
    return;
  }

Si te fijas, si no se conecta nadie se queda haciendo return y return sin disparar el keepalive del watchdog.

Por otro lado tienes que lees la petición web hasta que te llega ¿un "$"?
lo normal creo que sería String request = client.readStringUntil('\n');

Y aqui como te dijo surbyte:

while(Serial.available() <= 0){}

Se puede quedar en loop infinito y reset por watchdog. Usa mills y si pasan de X segundos (por ejemplo 2) y que retorne de la función devolviendo "" (cadena vacía).

Tampoco inicializas la variable "resp" dentro del loop por lo que si te diera un error LeerIR() te devolvería la última respuesta recibida del IR. Aunque esto no se si es adrede.

Saludos

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.