Skip to content

Commit e3d2655

Browse files
aaronfultonnzAaron Fultonzariiii9003
authored
Changed slcan serial read routine to be faster and to manage the buffer more carefully (#2028)
* Changed slcan serial read routine to be faster and to manage the buffer more cauciously * As per merge request suggestion Co-authored-by: zariiii9003 <52598363+zariiii9003@users.noreply.github.com> * as per merge request suggestion Co-authored-by: zariiii9003 <52598363+zariiii9003@users.noreply.github.com> * Simplified slcan serial reading * Added news fragment --------- Co-authored-by: Aaron Fulton <aaron@webtolife.software> Co-authored-by: zariiii9003 <52598363+zariiii9003@users.noreply.github.com>
1 parent 10ba2eb commit e3d2655

2 files changed

Lines changed: 8 additions & 11 deletions

File tree

can/interfaces/slcan.py

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -218,17 +218,13 @@ def _read(self, timeout: float | None) -> str | None:
218218
while True:
219219
# Due to accessing `serialPortOrig.in_waiting` too often will reduce the performance.
220220
# We read the `serialPortOrig.in_waiting` only once here.
221-
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()
221+
size = self.serialPortOrig.in_waiting or 1
222+
self._buffer.extend(self.serialPortOrig.read(size))
223+
224+
for i, byte in enumerate(self._buffer):
225+
if byte in (self._OK[0], self._ERROR[0]):
226+
string = self._buffer[: i + 1].decode()
227+
del self._buffer[: i + 1]
232228
return string
233229

234230
if _timeout.expired():

doc/changelog.d/2028.changed.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Improved performance in slcan interface

0 commit comments

Comments
 (0)