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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:09:04