Skip to content

Commit f73df21

Browse files
author
Aaron Fulton
committed
Changed slcan serial read routine to be faster and to manage the buffer more cauciously
1 parent 10ba2eb commit f73df21

1 file changed

Lines changed: 11 additions & 10 deletions

File tree

can/interfaces/slcan.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -219,16 +219,17 @@ def _read(self, timeout: float | None) -> str | None:
219219
# Due to accessing `serialPortOrig.in_waiting` too often will reduce the performance.
220220
# We read the `serialPortOrig.in_waiting` only once here.
221221
in_waiting = self.serialPortOrig.in_waiting
222-
for _ in range(max(1, in_waiting)):
223-
new_byte = self.serialPortOrig.read(1)
224-
if new_byte:
225-
self._buffer.extend(new_byte)
226-
else:
227-
break
228-
229-
if new_byte in (self._ERROR, self._OK):
230-
string = self._buffer.decode()
231-
self._buffer.clear()
222+
if in_waiting > 0:
223+
self._buffer.extend(self.serialPortOrig.read(in_waiting))
224+
else:
225+
byte = self.serialPortOrig.read(1)
226+
if byte:
227+
self._buffer.extend(byte)
228+
229+
for i in range(len(self._buffer)):
230+
if self._buffer[i] in (self._OK[0], self._ERROR[0]):
231+
string = self._buffer[: i + 1].decode()
232+
del self._buffer[: i + 1]
232233
return string
233234

234235
if _timeout.expired():

0 commit comments

Comments
 (0)