使用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
相关产品推荐
相关产品推荐

