如何通过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
相关产品推荐
相关产品推荐

