diff --git a/src/PMS/PMS.cpp b/src/PMS/PMS.cpp index e7d7af3..3faf919 100644 --- a/src/PMS/PMS.cpp +++ b/src/PMS/PMS.cpp @@ -37,6 +37,33 @@ bool PMSBase::begin(HardwareSerial &serial) { * @param serial */ void PMSBase::readPackage(HardwareSerial &serial) { + /** If readPackage has process as period larger than READ_PACKAGE_TIMEOUT, + * should be clear the lastPackage and readBufferIndex */ + if (lastReadPackage) { + unsigned long ms = (unsigned long)(millis() - lastReadPackage); + if (ms >= READ_PACKGE_TIMEOUT) { + /** Clear buffer */ + readBufferIndex = 0; + + /** Disable check read package timeout */ + lastPackage = 0; + + Serial.println("Last process timeout, clear buffer and last handle package"); + } + + lastReadPackage = millis(); + if (!lastReadPackage) { + lastReadPackage = 1; + } + } else { + lastReadPackage = millis(); + if (!lastReadPackage) { + lastReadPackage = 1; + } + } + + /** Count to call delay() to release the while loop MCU resource for avoid the + * watchdog time reset */ uint8_t delayCount = 0; while (serial.available()) { /** Get value */ @@ -108,7 +135,7 @@ void PMSBase::readPackage(HardwareSerial &serial) { /** Check that sensor removed */ if (lastPackage) { unsigned long ms = (unsigned long)(millis() - lastPackage); - if (ms >= 1500) { + if (ms >= READ_PACKGE_TIMEOUT) { lastPackage = 0; _connected = false; } diff --git a/src/PMS/PMS.h b/src/PMS/PMS.h index 2cc8e7b..20872bc 100644 --- a/src/PMS/PMS.h +++ b/src/PMS/PMS.h @@ -40,6 +40,11 @@ public: private: static const uint8_t package_size = 32; + + /** In normal package interval is 200-800ms, In case small changed on sensor + * it's will interval reach to 2.3sec + */ + const uint16_t READ_PACKGE_TIMEOUT = 3000; /** ms */ const int failCountMax = 10; int failCount = 0; @@ -53,6 +58,8 @@ private: unsigned long lastPackage = 0; bool _connected; + unsigned long lastReadPackage = 0; + uint16_t pms_raw0_1; uint16_t pms_raw2_5; uint16_t pms_raw10;