ESP8266 might crash in `S8_UART::serial_read_bytes` if sensor not connected
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!
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();
}
Yes, yield(); seems to also fix the problem.