必须给readline一个超时,否则它永远不会完成,因为无法检测到串行数据流 (EOF) 的结束。
readline
当没有数据被发送(或数据不包含换行符)时无限期阻塞,但您的应用程序也是如此。写类似的东西很好
def read(ser, queue):
while True:
queue.put(ser.readline())
threading.Thread(target=read, args=(ser, queue)).start()
或更现代的等价物
def read(ser, queue):
for line in ser:
queue.put(line)
threading.Thread(target=read, args=(ser, queue)).start()
但是,您应该知道阅读线程永远不会完成。因此,如果您的程序应该以非异常方式结束(即用户可以以某种方式退出它),您需要有一种机制来指示读取线程停止。为确保收到此信号,您需要使用超时 - 否则,线程可能会在没有串行数据的情况下无限期阻塞。例如,这可能看起来像:
def read(ser, queue):
buf = b''
ser.timeout = 1 # 1 second. Modify according to latency requirements
while not should_stop.is_set():
buf += ser.readline()
if buf.endswith('\n'):
queue.put(line)
buf = b''
# else: Interrupted by timeout
should_stop = threading.Event()
threading.Thread(target=read, args=(ser, queue)).start()
# ... somewhat later
should_stop.set() # Reading thread will exit within the next second