You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python多COM端口条码扫描器同步读取问题求助

多条码扫描器同步读取解决方案

问题根源

你当前的轮询方式有两个致命问题:

  1. 每次循环都打开/关闭串口,不仅效率低,还容易丢失设备缓冲的数据
  2. 单线程下执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 22:10:30