Python通过TCP socket连接RFID设备接收数据格式异常问题求助
报错原因
RFID设备返回的是二进制格式的协议数据,并非UTF-8编码的普通文本,所以直接调用decode()做文本解码必然会抛出编码错误。你需要的是将二进制数据转换为十六进制可读格式,而非文本解码。
解决方法
Python 3.5及以上版本可以直接使用bytes内置的hex()方法快速得到目标格式的输出,只需修改你代码中打印接收数据的行即可:
# 替换原来的 print(recv_data) 为下面的代码 print(recv_data.hex(' ').upper())
上述代码执行后输出结果就和TCP socket测试工具的输出完全一致:A0 13 01 89 1C 34 00 30 08 33 B2 DD D9 01 40 00 00 00 A4 70 4B。
如果使用的是不支持hex()传分隔符的低版本Python,可以用列表推导式手动拼接:
print(' '.join([f'{b:02X}' for b in recv_data]))
后续协议解析建议
如果需要解析RFID返回的协议字段,直接操作原始的recv_data字节对象即可:
- 取对应偏移位的字节数值:直接用下标取值,例如
recv_data[0]即可得到首字节0xA0对应的十进制数值160 - 解析多字节字段:可以使用Python标准库
struct模块做批量解析,适配大端/小端字节序需求
修改后完整代码
from socket import * HOST = '192.168.1.159' PORT = 4001 def main(): tcp_client_socket = socket(AF_INET,SOCK_STREAM) tcp_client_socket.connect((HOST,PORT)) while True: recv_data = tcp_client_socket.recv(10240) if recv_data: # 输出空格分隔的大写十六进制格式 print(recv_data.hex(' ').upper()) # 后续可在此处添加协议解析逻辑 else: break tcp_client_socket.close() if __name__ == '__main__': main()
内容的提问来源于stack exchange,提问作者jerry
相关产品推荐
相关产品推荐

