我想在Linux上的python中同时读取两个(或多个)串行端口(/ dev / ttyUSB0等)。我想从每个端口读取完整的行(无论哪个都有数据),并按收到的顺序处理结果(无竞争条件)。作为一个简单的示例,可以将这些行写入单个合并的文件中。
我认为这样做的方法是基于pyserial的,但是我不太清楚该怎么做。Pyserial使用asyncio和threads进行非阻塞读取。Asyncio被标记为实验性的。我假设如果在中进行处理,就不会有任何竞争条件 asyncio.Protocol.data_received()。在线程的情况下,处理可能必须由互斥锁保护。
asyncio.Protocol.data_received()
也许这也可以不用pyserial来完成。可以将两个串行端口作为文件打开,然后使用读取数据select()。
select()
正如@AlexHall在评论中所建议的,以下是一种解决方案,该解决方案对每个串行端口使用一个线程,并使用一个队列来同步访问:
import serial import Queue import threading queue = Queue.Queue(1000) def serial_read(s): while True: line = s.readline() queue.put(line) serial0 = serial.Serial('/dev/ttyUSB0') serial1 = serial.Serial('/dev/ttyUSB1') thread1 = threading.Thread(target=serial_read, args=(serial0,),).start() thread2 = threading.Thread(target=serial_read, args=(serial1,),).start() while True: line = queue.get(True, 1) print line
也许可以更优雅地编写此代码,但是它可以工作。