loop: fix nonblocking read, update is_open in close()
diff --git a/serial/urlhandler/protocol_loop.py b/serial/urlhandler/protocol_loop.py
index f5104b4..801ba79 100644
--- a/serial/urlhandler/protocol_loop.py
+++ b/serial/urlhandler/protocol_loop.py
@@ -76,6 +76,7 @@
self.reset_output_buffer()
def close(self):
+ self.is_open = False
self.queue.put(None)
super(Serial, self).close()
@@ -129,21 +130,28 @@
"""
if not self.is_open:
raise portNotOpenError
- if self._timeout is not None:
+ if self._timeout is not None and self._timeout != 0:
timeout = time.time() + self._timeout
else:
timeout = None
data = bytearray()
while size > 0 and self.is_open:
try:
- data += self.queue.get(timeout=self._timeout) # XXX inter char timeout
+ b = self.queue.get(timeout=self._timeout) # XXX inter char timeout
except queue.Empty:
- break
+ if self._timeout == 0:
+ break
else:
- size -= 1
+ if data is not None:
+ data += b
+ size -= 1
+ else:
+ break
# check for timeout now, after data has been read.
# useful for timeout = 0 (non blocking) read
if timeout and time.time() > timeout:
+ if self.logger:
+ self.logger.info('read timeout')
break
return bytes(data)