RS-232接口UHF RFID阅读器字节转十六进制字符串格式求助
UHF RFID阅读器串口输出格式调整问题
我有一台物理接口兼容RS-232规范的UHF RFID阅读器,通信参数为1起始位、8数据位、1停止位、无奇偶校验。以下是我控制阅读器读取UHF RFID标签的代码:
import serial ser = serial.Serial(port='COM8', baudrate=115200, timeout=0.01) ba_antenna_set_1 = b'\xA0\x04\x01\x74\x00\xE7' ba_antenna_set_2 = b'\xA0\x04\x01\x74\x10\xD7' ba_inventory = b'\xA0\x04\x01\x89\x01\xD1' ser.write(ba_antenna_set_1); ser.write(ba_antenna_set_2); while True: ser.write(ba_inventory); if ser.in_waiting > 0: data = ser.readline() print(data)
运行代码后,得到的输出如下:
b'\xa0\x04\x01t\x10\xd7' b'\xa0\x13\x01\x89t0\x000\x083\xb2\xdd\xd9\x01@\x00\x00\x00\x00M\xbe' b'\xa0\n' b'\x01\x89\x00\x00\x10\x00\x00\x00\x01\xbb' b'\xa0\x13\x01\x89\x040\x000\x083\xb2\xdd\xd9\x01@\x00\x00\x00\x00N-'
我希望输出格式改为如下形式(大写十六进制,字节间用空格分隔,整体包裹单引号):
'A0 04 01 74 00 E7' 'A0 04 01 74 10 D7' 'A0 04 01 89 01 D1' 'A0 13 01 89 24 30 00 30 08 33 B2 DD D9 01 40 00 00 00 00 50 0B' 'A0 0A 01 89 00 00 11 00 00 00 01 BA'
修改后的代码
要实现目标格式,只需添加一个格式化函数转换字节串格式,同时优化串口读取逻辑避免数据分段,修改后的代码如下:
import serial def format_bytes(data): # 将字节串转为两位大写十六进制,用空格连接后包裹单引号 hex_str = ' '.join(f'{byte:02X}' for byte in data) return f"'{hex_str}'" ser = serial.Serial(port='COM8', baudrate=115200, timeout=0.01) ba_antenna_set_1 = b'\xA0\x04\x01\x74\x00\xE7' ba_antenna_set_2 = b'\xA0\x04\x01\x74\x10\xD7' ba_inventory = b'\xA0\x04\x01\x89\x01\xD1' # 发送命令并打印格式化内容 ser.write(ba_antenna_set_1) print(format_bytes(ba_antenna_set_1)) ser.write(ba_antenna_set_2) print(format_bytes(ba_antenna_set_2)) while True: ser.write(ba_inventory) print(format_bytes(ba_inventory)) if ser.in_waiting > 0: data = ser.read(ser.in_waiting) # 读取所有待接收数据,避免粘包 print(format_bytes(data))
关键说明
format_bytes函数负责核心转换:遍历字节串的每个字节,转为两位大写十六进制格式,用空格拼接后包裹单引号。- 替换
ser.readline()为ser.read(ser.in_waiting),避免因阅读器返回数据不含换行符导致的分段读取问题,保证数据完整性。 - 发送每个命令后立即打印其格式化内容,与阅读器返回的格式化数据一一对应。
内容的提问来源于stack exchange,提问作者Ali Musabeyoğlu
相关产品推荐
相关产品推荐

