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

通过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)

正确查看和解析数据的方法:

  1. 以十六进制格式打印响应,避免ASCII字符干扰:
    修改代码中的打印语句:

    print(temp.hex())  # 输出为 0103040a4a1390d5,数据一目了然
    
  2. 解析成温度值:
    具体解析规则需参考温度变送器的手册,常见两种情况:

    • 情况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} ℃")
      

额外验证:

可以用Modbus CRC校验工具验证响应最后两个字节0x90D5是否正确,确认设备返回的响应完整有效。

内容的提问来源于stack exchange,提问作者KurtA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 06:15:20