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

使用pyserial调用Datalogic 8500xt扫描条码时丢失最后一位的问题

条码扫描器读取数据丢失最后一位的代码问题排查

问题描述

使用Python的pyserial库连接Datalogic 8500xt条码扫描器时,扫描结果总是丢失最后一位:扫描7位条码“1234567”仅返回“123456”,扫描5位条码“09876”仅返回“0987”。已尝试调整扫描器设置、增加扫描间隔,问题仍存在,怀疑代码有遗漏。

相关代码片段

try:
    # device_port= serial_ports()[0]
    device_port= 'COM3'
    print("device_port : ",device_port)
    print("Connecting device")
    ser = serial.Serial(
        port = device_port,
        timeout = 1,
        baudrate=9600,
        parity=serial.PARITY_EVEN,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.SEVENBITS,
    )
    i = True

    while i:
        # if wt == 'S14\x0D':
            ser.write('S01\x0D'.encode('utf-8'))
            print("connected")
            # ser.write('\x05'.encode('utf-8'))
            # time.sleep(1)
            barcode=None
            read_val = ser.read(size=128)
            read_val = str(read_val, 'UTF-8')  
            res = list(read_val)
            print(res)
            res = res[4:-1]
            if len(res)>0:
                i=False
                barcode=res
    ser.close()
    return {"barcode": barcode}
            
except:           
        return {"message": "No Barcode Device Connected"}

代码问题排查

  • 切片操作直接截断最后一位:代码中res = res[4:-1]这一行,-1索引会强制移除列表的最后一个元素,这是导致扫描结果丢失最后一位的直接原因。需要先确认扫描器返回的数据格式:比如前4位是否是固定前缀,末尾是否有明确的结束符(如\r或\n)。如果末尾是结束符,应该单独判断并移除结束符,而非直接切掉最后一位;如果没有结束符,应改为res = res[4:]保留完整数据。
  • 固定长度读取易引发数据异常:使用ser.read(size=128)是一次性读取最多128字节,但扫描器返回的条码数据通常以换行符作为结束标志,更可靠的方式是使用ser.readline(),它会自动读取直到遇到结束符,确保获取完整的条码数据,避免截断或多读无关内容。
  • 串口参数需严格匹配扫描器设置:再次确认扫描器的实际输出参数(波特率、奇偶校验、停止位、字节数)是否和代码中serial.Serial的参数完全一致。比如若扫描器实际使用8位字节数(serial.EIGHTBITS),而代码设置为SEVENBITS,会直接导致数据解析错位。
  • 循环逻辑存在冗余干扰:每次循环都发送'S01\x0D'指令,可能干扰扫描器的正常输出流程,该指令应仅在初始化连接时发送一次,而非每次读取数据都重复发送。

内容的提问来源于stack exchange,提问作者jaswant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:35:14