diff --git a/can/interfaces/slcan.py b/can/interfaces/slcan.py index 086d9ed32..a6430d4e2 100644 --- a/can/interfaces/slcan.py +++ b/can/interfaces/slcan.py @@ -218,17 +218,13 @@ def _read(self, timeout: float | None) -> str | None: while True: # Due to accessing `serialPortOrig.in_waiting` too often will reduce the performance. # We read the `serialPortOrig.in_waiting` only once here. - in_waiting = self.serialPortOrig.in_waiting - for _ in range(max(1, in_waiting)): - new_byte = self.serialPortOrig.read(1) - if new_byte: - self._buffer.extend(new_byte) - else: - break - - if new_byte in (self._ERROR, self._OK): - string = self._buffer.decode() - self._buffer.clear() + size = self.serialPortOrig.in_waiting or 1 + self._buffer.extend(self.serialPortOrig.read(size)) + + for i, byte in enumerate(self._buffer): + if byte in (self._OK[0], self._ERROR[0]): + string = self._buffer[: i + 1].decode() + del self._buffer[: i + 1] return string if _timeout.expired(): diff --git a/doc/changelog.d/2028.changed.md b/doc/changelog.d/2028.changed.md new file mode 100644 index 000000000..d64d9a08b --- /dev/null +++ b/doc/changelog.d/2028.changed.md @@ -0,0 +1 @@ +Improved performance in slcan interface