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

Windows环境下Python对接Netum条码扫描仪的设备区分及稳定性问题

解决Netum条码扫描仪COM模式断开及多设备区分问题

一、优先解决COM模式频繁断开的核心问题

  1. 替换为官方专用驱动
    设备管理器显示驱动更新不代表是Netum针对COM模式的专用驱动,Windows自带的通用USB转串口驱动可能存在兼容性问题。去Netum官网找到对应型号的USB COM端口模拟驱动,卸载现有驱动后手动安装,安装时选择“自定义安装”确保覆盖所有相关组件。

  2. 排查USB连接稳定性

    • 把USB dongle插在主板原生USB接口(避开前置面板或劣质USB hub),避免供电不足导致断开;
    • 更换质量可靠的USB数据线(部分廉价线存在信号衰减问题);
    • 关闭Windows的USB选择性暂停功能:控制面板→电源选项→更改计划设置→更改高级电源设置→USB设置→USB选择性暂停设置,设置为“禁用”。
  3. 匹配扫描仪COM模式参数
    查阅扫描仪说明书,确认COM模式下的波特率、数据位、停止位、流控设置(很多设备默认开启RTS/CTS硬件流控,但你的代码里没启用),调整代码参数与设备一致,比如添加rtscts=True到Serial初始化中。

  4. 更新设备固件
    部分旧固件版本存在COM模式的连接bug,登录Netum官网查看对应型号的固件更新工具和教程,升级到最新版本。

二、多设备区分方案

  1. 固定COM端口号
    打开设备管理器→找到对应扫描仪的COM端口→右键属性→端口设置→高级→勾选“使用固定端口号”,为每台设备分配唯一的端口(如COM3、COM4),代码中直接针对不同端口创建监听线程。

  2. 通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:10:40