通过MODBUS读取温度变送器返回乱码,Python代码问题求助
Modbus读取温度变送器返回的不是乱码,是正常字节表示
你看到的\nJ根本不是乱码,是Python对字节串的默认显示规则导致的——当字节值对应可打印的ASCII字符时,Python会直接显示该字符,而非十六进制转义。
拆解你的响应字节:
你的响应是b'\x01\x03\x04\nJ\x13\x90\xd5',转成十六进制格式更清晰:
\x01:设备地址,和你发送的请求一致,没问题\x03:功能码,对应读取保持寄存器,正确\x04:后续数据的字节数,你请求了2个寄存器(每个2字节),返回4字节数据,符合预期\n:对应十六进制\x0A,是第一个寄存器的高字节J:对应十六进制\x4A,是第一个寄存器的低字节\x13:第二个寄存器的高字节\x90:第二个寄存器的低字节\xd5:CRC校验码的一部分(完整CRC为0x90D5)
正确查看和解析数据的方法:
以十六进制格式打印响应,避免ASCII字符干扰:
修改代码中的打印语句:print(temp.hex()) # 输出为 0103040a4a1390d5,数据一目了然解析成温度值:
具体解析规则需参考温度变送器的手册,常见两种情况:- 情况1:两个寄存器组成32位IEEE754浮点数
使用struct模块解析(通常为大端模式):import struct # 提取数据部分:第3到第6字节 data_part = temp[3:7] # 大端模式解析为浮点数 temp_value = struct.unpack('!f', data_part)[0] print(f"当前温度: {temp_value} ℃") - 情况2:16位整数带缩放系数
若第一个寄存器为温度值,缩放系数为0.1:# 拼接第一个寄存器的高低字节为整数 reg1 = (temp[3] << 8) | temp[4] temp_value = reg1 * 0.1 print(f"当前温度: {temp_value} ℃")
- 情况1:两个寄存器组成32位IEEE754浮点数
额外验证:
可以用Modbus CRC校验工具验证响应最后两个字节0x90D5是否正确,确认设备返回的响应完整有效。
内容的提问来源于stack exchange,提问作者KurtA
相关产品推荐
相关产品推荐

