@@ -86,25 +86,35 @@ void ESP3DSerialService::receiveCb() {
86
86
if (!started ()) {
87
87
return ;
88
88
}
89
+ // take mutex
89
90
if (xSemaphoreTake (_mutex, portMAX_DELAY)) {
90
- uint32_t now = millis ();
91
- while ((millis () - now) < SERIAL_COMMUNICATION_TIMEOUT) {
92
- if (Serials[_serialIndex]->available ()) {
93
- _buffer[_buffer_size] = Serials[_serialIndex]->read ();
94
- now = millis ();
95
- if (esp3d_string::isRealTimeCommand (_buffer[_buffer_size])) {
96
- flushChar (_buffer[_buffer_size]);
97
- _buffer[_buffer_size] = ' \0 ' ; // remove realtime command from buffer
98
- } else {
99
- _buffer_size++;
100
- if (_buffer_size > ESP3D_SERIAL_BUFFER_SIZE ||
101
- _buffer[_buffer_size - 1 ] == ' \n ' ) {
102
- flushBuffer ();
103
- }
91
+ // Get expected len of data
92
+ size_t count = Serials[_serialIndex]->available ();
93
+
94
+ // loop until each byte is handled
95
+ while (count > 0 ) {
96
+ int data = Serials[_serialIndex]->read ();
97
+
98
+ // If read() failed we leave
99
+ if (data == -1 ) {
100
+ esp3d_log_e (" Serial read failed unexpectedly" );
101
+ break ; // only break to release mutex
102
+ }
103
+ // take the char
104
+ count--;
105
+ _buffer[_buffer_size] = (uint8_t )data;
106
+ // check what next step is
107
+ if (esp3d_string::isRealTimeCommand (_buffer[_buffer_size])) {
108
+ flushChar (_buffer[_buffer_size]);
109
+ _buffer[_buffer_size] = ' \0 ' ; // remove realtime command from buffer
110
+ } else {
111
+ _buffer_size++;
112
+ if (_buffer_size > ESP3D_SERIAL_BUFFER_SIZE || _buffer[_buffer_size - 1 ] == ' \n ' ) {
113
+ flushBuffer ();
104
114
}
105
115
}
106
116
}
107
-
117
+ // release mutex
108
118
xSemaphoreGive (_mutex);
109
119
} else {
110
120
esp3d_log_e (" Mutex not taken" );
@@ -256,4 +266,4 @@ bool ESP3DSerialService::reset() {
256
266
257
267
#endif // COMMUNICATION_PROTOCOL == RAW_SERIAL ||
258
268
// defined(ESP_SERIAL_BRIDGE_OUTPUT)
259
- #endif // ARDUINO_ARCH_ESP32
269
+ #endif // ARDUINO_ARCH_ESP32
0 commit comments