Windows环境下Python对接Netum条码扫描仪的设备区分及稳定性问题
解决Netum条码扫描仪COM模式断开及多设备区分问题
一、优先解决COM模式频繁断开的核心问题
替换为官方专用驱动
设备管理器显示驱动更新不代表是Netum针对COM模式的专用驱动,Windows自带的通用USB转串口驱动可能存在兼容性问题。去Netum官网找到对应型号的USB COM端口模拟驱动,卸载现有驱动后手动安装,安装时选择“自定义安装”确保覆盖所有相关组件。排查USB连接稳定性
- 把USB dongle插在主板原生USB接口(避开前置面板或劣质USB hub),避免供电不足导致断开;
- 更换质量可靠的USB数据线(部分廉价线存在信号衰减问题);
- 关闭Windows的USB选择性暂停功能:控制面板→电源选项→更改计划设置→更改高级电源设置→USB设置→USB选择性暂停设置,设置为“禁用”。
匹配扫描仪COM模式参数
查阅扫描仪说明书,确认COM模式下的波特率、数据位、停止位、流控设置(很多设备默认开启RTS/CTS硬件流控,但你的代码里没启用),调整代码参数与设备一致,比如添加rtscts=True到Serial初始化中。更新设备固件
部分旧固件版本存在COM模式的连接bug,登录Netum官网查看对应型号的固件更新工具和教程,升级到最新版本。
二、多设备区分方案
固定COM端口号
打开设备管理器→找到对应扫描仪的COM端口→右键属性→端口设置→高级→勾选“使用固定端口号”,为每台设备分配唯一的端口(如COM3、COM4),代码中直接针对不同端口创建监听线程。通过VID/PID识别设备
利用pyserial.tools.list_ports获取设备的VID(供应商ID)和PID(产品ID),这是设备的唯一标识,即使COM端口变化也能精准区分:from serial.tools import list_ports # 从设备管理器查看Netum设备的VID和PID,替换为实际值 NETUM_VID = 0xXXXX NETUM_PID = 0xYYYY def get_scanner_ports(): scanner_ports = [] for port in list_ports.comports(): if port.vid == NETUM_VID and port.pid == NETUM_PID: scanner_ports.append(port.device) return scanner_ports
三、优化PySerial监听代码
原代码仅读取一次就关闭,无法持续监听且没有重连机制,优化后的代码支持持续监听和断开自动重连,同时处理多设备:
import serial import time import threading from serial.tools import list_ports NETUM_VID = 0xXXXX NETUM_PID = 0xYYYY def listen_scanner(port): while True: try: # 匹配设备参数,开启硬件流控 scanner = serial.Serial( port=port, baudrate=9600, bytesize=8, stopbits=serial.STOPBITS_ONE, timeout=1, rtscts=True ) print(f"已连接扫描仪: {port}") while True: # 条码通常以换行结尾,用readline读取完整内容 data = scanner.readline() if data: barcode = data.decode('utf-8').strip() print(f"[{port}] 扫描到条码: {barcode}") time.sleep(0.1) except serial.SerialException as e: print(f"{port} 连接断开: {str(e)}") time.sleep(5) # 5秒后尝试重连 continue if __name__ == "__main__": scanner_ports = get_scanner_ports() if not scanner_ports: print("未找到Netum扫描仪") exit() # 为每台设备创建独立监听线程 threads = [] for port in scanner_ports: t = threading.Thread(target=listen_scanner, args=(port,), daemon=True) t.start() threads.append(t) # 保持主进程运行 try: while True: time.sleep(1) except KeyboardInterrupt: print("程序退出")
内容的提问来源于stack exchange,提问作者Spencer Wakefield
相关产品推荐
相关产品推荐

