S8_UART icon indicating copy to clipboard operation
S8_UART copied to clipboard

ESP8266 might crash in `S8_UART::serial_read_bytes` if sensor not connected

Open EricDuminil opened this issue 3 years ago • 2 comments

In https://github.com/jcomas/S8_UART/blob/main/examples/co2/co2.cpp, if Senseair S8 isn't connected, the example code is supposed to display Serial.println("SenseAir S8 CO2 sensor not found!");.

On a ESP8266, it often doesn't. The microcontroller crashes instead, because the while loop in S8_UART::serial_read_bytes blocks during 5 seconds, and the watchdog resets the ESP.

Adding a short delay (e.g. delay(50)) in the loop, before end_t = millis(); seems to fix the problem.

Other than that, the library seems to work well, on both ESP32 and ESP8266. On ESP8266, I replaced SoftwareSerial with https://github.com/CrazyRobMiles/Esp8266EdgeSoftwareSerial, which uses much less memory. Thanks for the good work!

EricDuminil avatar Jul 04 '22 08:07 EricDuminil

Can you try adding "yield" instead of delay in S8_UART::serial_read_bytes ?

while (((end_t - start_t) <= timeout_ms) && !readed) {

     yield();

     if(mySerial->available()) {
          nb = mySerial->readBytes(buf_msg, max_bytes);
          readed = true;
     }
     end_t = millis();
}

jcomas avatar Jul 04 '22 11:07 jcomas

Yes, yield(); seems to also fix the problem.

EricDuminil avatar Jul 08 '22 17:07 EricDuminil