|
@@ -210,8 +210,14 @@ class SerialDevice(Device): |
|
|
timeout_event.reading = False |
|
|
timeout_event.reading = False |
|
|
timeout_event.reading = True |
|
|
timeout_event.reading = True |
|
|
|
|
|
|
|
|
if purge_buffer: |
|
|
|
|
|
self._buffer = b'' |
|
|
|
|
|
|
|
|
buf = b'' |
|
|
|
|
|
if not purge_buffer: |
|
|
|
|
|
#Add previous leftovers to front of buf so leftovers can be searched for newlines |
|
|
|
|
|
#If there were no leftovers then self._buffer will be empty |
|
|
|
|
|
buf = self._buffer |
|
|
|
|
|
|
|
|
|
|
|
self._buffer = b'' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
got_line, data = False, '' |
|
|
got_line, data = False, '' |
|
|
|
|
|
|
|
@@ -222,17 +228,27 @@ class SerialDevice(Device): |
|
|
leftovers = b'' |
|
|
leftovers = b'' |
|
|
try: |
|
|
try: |
|
|
while timeout_event.reading and not got_line: |
|
|
while timeout_event.reading and not got_line: |
|
|
read_ready, _, _ = select.select([self._device.fileno()], [], [], 0.5) |
|
|
|
|
|
if len(read_ready) == 0: |
|
|
|
|
|
|
|
|
#If there is leftover data then only perform a poll to set the read_ready flag |
|
|
|
|
|
#otherwise block here until short timeout waiting for more data |
|
|
|
|
|
select_timeout = 0.5 |
|
|
|
|
|
if len(self._buffer) > 0: |
|
|
|
|
|
select_timeout = 0.1 |
|
|
|
|
|
read_ready, _, _ = select.select([self._device.fileno()], [], [], select_timeout) |
|
|
|
|
|
if len(read_ready) == 0 and len(self._buffer) == 0: |
|
|
continue |
|
|
continue |
|
|
|
|
|
|
|
|
bytes_avail = 0 |
|
|
|
|
|
if hasattr(self._device, "in_waiting"): |
|
|
|
|
|
bytes_avail = self._device.in_waiting |
|
|
|
|
|
else: |
|
|
|
|
|
bytes_avail = self._device.inWaiting() |
|
|
|
|
|
|
|
|
#Only read data if there is some waiting |
|
|
|
|
|
if len(read_ready) > 0: |
|
|
|
|
|
bytes_avail = 0 |
|
|
|
|
|
if hasattr(self._device, "in_waiting"): |
|
|
|
|
|
bytes_avail = self._device.in_waiting |
|
|
|
|
|
else: |
|
|
|
|
|
bytes_avail = self._device.inWaiting() |
|
|
|
|
|
|
|
|
|
|
|
device_data = self._device.read(bytes_avail) |
|
|
|
|
|
|
|
|
buf = self._device.read(bytes_avail) |
|
|
|
|
|
|
|
|
#Append new data to previous leftovers, if any |
|
|
|
|
|
buf = buf + device_data |
|
|
|
|
|
|
|
|
for idx in range(len(buf)): |
|
|
for idx in range(len(buf)): |
|
|
c = buf[idx] |
|
|
c = buf[idx] |
|
@@ -242,15 +258,14 @@ class SerialDevice(Device): |
|
|
ub = bytes([ub]) |
|
|
ub = bytes([ub]) |
|
|
|
|
|
|
|
|
# NOTE: AD2SERIAL and AD2PI apparently sends down \xFF on boot. |
|
|
# NOTE: AD2SERIAL and AD2PI apparently sends down \xFF on boot. |
|
|
if ub != b'' and ub != b"\xff": |
|
|
|
|
|
self._buffer += ub |
|
|
|
|
|
|
|
|
|
|
|
if ub == b"\n": |
|
|
|
|
|
self._buffer = self._buffer.strip(b"\r\n") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ub != b'' and ub != b"\xff" and ub != b"\r": |
|
|
|
|
|
if ub != b"\n": |
|
|
|
|
|
self._buffer += ub |
|
|
|
|
|
else: |
|
|
|
|
|
#found end of line |
|
|
if len(self._buffer) > 0: |
|
|
if len(self._buffer) > 0: |
|
|
got_line = True |
|
|
got_line = True |
|
|
leftovers = buf[idx:] |
|
|
|
|
|
|
|
|
leftovers = buf[idx+1:] |
|
|
break |
|
|
break |
|
|
|
|
|
|
|
|
except (OSError, serial.SerialException) as err: |
|
|
except (OSError, serial.SerialException) as err: |
|
|