Python多COM端口条码扫描器同步读取问题求助
多条码扫描器同步读取解决方案
问题根源
你当前的轮询方式有两个致命问题:
- 每次循环都打开/关闭串口,不仅效率低,还容易丢失设备缓冲的数据
- 单线程下执行
readline()时的timeout会阻塞整个循环,导致其他扫描器的输入被错过
最优解决方案:多线程+长连接
给每个扫描器分配独立线程,保持串口长连接,让各设备的读取操作互不干扰,完美解决阻塞问题,同时配合Netum的临时断连缓冲功能,能最大程度保证数据不丢失。
完整代码示例
import serial import threading import time def read_scanner(port): scanner = None while True: # 维持串口连接,断开自动重试 if not scanner or not scanner.is_open: try: scanner = serial.Serial( port=port, baudrate=9600, bytesize=8, timeout=0.1, # 短超时,减少线程阻塞时间 stopbits=serial.STOPBITS_ONE, exclusive=True # 独占串口,避免冲突 ) print(f"扫描器[{port}]已连接") except Exception as e: print(f"扫描器[{port}]连接失败: {str(e)}") time.sleep(2) continue # 持续读取数据 try: data = scanner.readline() if data: # 解码并带上端口标识输出,区分不同设备 print(f"[{port}] {data.decode('utf-8').strip()}") except Exception as e: print(f"扫描器[{port}]读取出错: {str(e)}") scanner.close() scanner = None time.sleep(2) # 替换成你的扫描器实际端口列表 scan_ports = ["COM3", "COM4", "COM5"] # 启动所有扫描器的读取线程 threads = [] for port in scan_ports: t = threading.Thread(target=read_scanner, args=(port,), daemon=True) t.start() threads.append(t) # 主线程保持运行,按Ctrl+C终止 try: while True: time.sleep(1) except KeyboardInterrupt: print("\n程序终止中...")
关键说明
- 多线程隔离:每个扫描器独立线程运行,一个设备的读取阻塞不会影响其他设备
- 长连接复用:避免频繁打开/关闭串口,同时能利用Netum的断连缓冲功能,重连后自动获取缓冲数据
- 短超时设置:把timeout设为0.1秒,线程能快速响应数据,不会长时间挂起
- 异常处理:自动处理连接断开、读取错误等情况,提升稳定性
- 设备区分:通过端口号标识数据来源,清晰区分不同扫描器的输入
额外建议
- 可以用
serial.tools.list_ports.comports()自动枚举可用串口,手动筛选扫描器端口 - 如果扫描器参数(波特率、数据位等)不同,需在
serial.Serial中对应调整 - 若需要统一处理所有扫描器的数据,可以引入
queue.Queue,把读取到的数据放入队列,主线程统一处理
内容的提问来源于stack exchange,提问作者Spencer Wakefield
相关产品推荐
相关产品推荐

