diff --git a/esp3d/src/include/esp3d_version.h b/esp3d/src/include/esp3d_version.h index 2cf1616b..09cbf2dc 100644 --- a/esp3d/src/include/esp3d_version.h +++ b/esp3d/src/include/esp3d_version.h @@ -22,7 +22,7 @@ #define _VERSION_ESP3D_H // version and sources location -#define FW_VERSION "3.0.0.3b1" +#define FW_VERSION "3.0.0.4b1" #define REPOSITORY "https://github.com/luc-github/ESP3D/tree/3.0" #endif //_VERSION_ESP3D_H diff --git a/esp3d/src/modules/serial/serial_service_esp32.cpp b/esp3d/src/modules/serial/serial_service_esp32.cpp index f541b432..b341fae9 100644 --- a/esp3d/src/modules/serial/serial_service_esp32.cpp +++ b/esp3d/src/modules/serial/serial_service_esp32.cpp @@ -86,25 +86,35 @@ void ESP3DSerialService::receiveCb() { if (!started()) { return; } + //take mutex if (xSemaphoreTake(_mutex, portMAX_DELAY)) { - uint32_t now = millis(); - while ((millis() - now) < SERIAL_COMMUNICATION_TIMEOUT) { - if (Serials[_serialIndex]->available()) { - _buffer[_buffer_size] = Serials[_serialIndex]->read(); - now = millis(); - if (esp3d_string::isRealTimeCommand(_buffer[_buffer_size])) { - flushChar(_buffer[_buffer_size]); - _buffer[_buffer_size] = '\0'; //remove realtime command from buffer - } else { - _buffer_size++; - if (_buffer_size > ESP3D_SERIAL_BUFFER_SIZE || - _buffer[_buffer_size - 1] == '\n') { - flushBuffer(); - } + // Get expected len of data + size_t count = Serials[_serialIndex]->available(); + + //loop until each byte is handled + while (count > 0) { + int data = Serials[_serialIndex]->read(); + + // If read() failed we leave + if (data == -1) { + esp3d_log_e("Serial read failed unexpectedly"); + break; // only break to release mutex + } + //take the char + count--; + _buffer[_buffer_size] = (uint8_t)data; + //check what next step is + if (esp3d_string::isRealTimeCommand(_buffer[_buffer_size])) { + flushChar(_buffer[_buffer_size]); + _buffer[_buffer_size] = '\0'; //remove realtime command from buffer + } else { + _buffer_size++; + if (_buffer_size > ESP3D_SERIAL_BUFFER_SIZE || _buffer[_buffer_size - 1] == '\n') { + flushBuffer(); } } } - + //release mutex xSemaphoreGive(_mutex); } else { esp3d_log_e("Mutex not taken"); @@ -256,4 +266,4 @@ bool ESP3DSerialService::reset() { #endif // COMMUNICATION_PROTOCOL == RAW_SERIAL || // defined(ESP_SERIAL_BRIDGE_OUTPUT) -#endif // ARDUINO_ARCH_ESP32 \ No newline at end of file +#endif // ARDUINO_ARCH_ESP32 diff --git a/info.json b/info.json index 2b4e2dbf..7d75bbc4 100644 --- a/info.json +++ b/info.json @@ -1,3 +1,3 @@ { - "version": "3.0.0.3b1" + "version": "3.0.0.4b1" }