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

如何通过CMD/脚本读写单片机Modbus寄存器?PyModbus报错求助

解决PyModbus读保持寄存器返回ExceptionResponse的问题

首先,先获取ExceptionResponse的具体异常码,这是定位问题的关键。修改你的读寄存器代码,加入异常码打印逻辑:

from pymodbus.client import ModbusSerialClient

# 初始化串口客户端,参数要和你的设备匹配
client = ModbusSerialClient(
    method='rtu',
    port='COM3',  # 替换成你的USB转RS232实际端口
    baudrate=9600,
    parity='N',
    stopbits=1,
    bytesize=8,
    timeout=1
)

if client.connect():
    # 注意:Modbus Poll默认用1基地址,PyModbus默认0基,这里可能需要把Poll里的地址减1
    res = client.read_holding_registers(address=0, count=10, slave=1)
    if hasattr(res, 'exception_code'):
        print(f"Modbus异常码: {res.exception_code}")
        # 常见异常码对应说明:
        # 1=非法功能码, 2=非法数据地址, 3=非法数据值, 4=从站设备故障, 5=确认, 6=从站忙
    else:
        print(res.registers)
    client.close()
else:
    print("设备连接失败")

接下来对照Modbus Poll的配置逐一排查:

  • 从站地址(Slave ID):确保代码中slave参数和Modbus Poll里设置的完全一致,多数设备默认是1,但部分设备会自定义。
  • 寄存器地址偏移:Modbus Poll默认使用1基地址(比如Poll里选的地址100,对应协议实际地址是99),而PyModbus默认用0基,所以需要把Poll中的地址减1再填入代码的address参数。
  • 串口参数:核对波特率、奇偶校验、停止位、字节数,必须和Modbus Poll以及单片机的配置完全匹配,比如部分设备会用偶校验('E')或1.5停止位。
  • 功能码匹配:read_holding_registers对应功能码03,如果你在Modbus Poll里用的是输入寄存器(功能码04),要换成PyModbus的read_input_registers方法。

如果异常码是2(非法数据地址),大概率是地址偏移问题;如果是1(非法功能码),检查单片机是否支持该功能码;如果是3(非法数据值),可能是读取的寄存器数量超出了单片机的可用范围。

可以先测试单寄存器读取(count=1),成功后再逐步增加读取数量,排除批量读取的兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 00:05:04