3

我正在尝试按照这个建议实现串行通信。

基本上我会有一个单独的线程,阻塞,监听端口,当收到完整的行时,将其推送到全局队列。

但是,文档中的这个警告让我感到困惑:

readlines() 仅适用于超时

这是什么意思?我如何实现我的意图。我不想不得不

while True:
    a = self.ser.read(1)
    if a == '/n':
        blqblq()
    elif a == '/r'
        b = self.ser.read(1)
        if b == '/n':
            nana()
4

1 回答 1

4

必须给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
于 2013-09-11T11:40:30.793 回答