使用pymodbus+PC端Modbus Slave向树莓派3B+传数据连接失败求助
Modbus RTU连接失败问题排查与解决(树莓派3B+ + CH340 + PC Modbus Slave)
问题描述
尝试通过pymodbus库实现PC(Modbus Slave程序)与树莓派3B+的Modbus数据传输,采用CH340 USB转Modbus转换器建立连接,连接失败。树莓派端代码运行时提示failed to connect [{str(self)}]错误,PC端Modbus Slave提示“连接到计算机的设备无法正常工作”。参考旧视频教程操作,但因pymodbus版本更新,无法适配解决。
树莓派端原代码
from pymodbus.client import ModbusSerialClient from pymodbus.transaction import ModbusRtuFramer as ModbusFramer client = ModbusSerialClient( framer=ModbusFramer, method='rtu', port='dev/ttyUSB0', baudrate=9600, bytesize=8, parity="N", stopbits=1, retries = 5, timeout=1, debug = True ) client.strict = False client.connect() res = client.read_holding_registers(address=300, count=1, unit=1) res.registers
排查与解决步骤
1. 修正串口路径错误
原代码中port='dev/ttyUSB0'缺少开头的/,正确路径应为/dev/ttyUSB0。路径错误会直接导致树莓派无法识别串口设备,是连接失败的常见原因。
2. 确认CH340设备识别与权限
- 在树莓派终端执行
ls /dev/ttyUSB*,检查CH340是否被正确识别:- 无输出:说明驱动未加载或硬件故障,执行
sudo apt install linux-modules-extra-raspi安装树莓派CH340驱动,同时更换USB口/数据线测试 - 有输出:执行
sudo usermod -aG dialout pi将当前用户加入串口权限组,重启后生效(避免每次手动改权限)
- 无输出:说明驱动未加载或硬件故障,执行
3. 严格匹配Modbus参数
确保PC端Modbus Slave与树莓派代码的参数完全一致:
- 波特率9600、数据位8、奇偶校验N、停止位1
- 从站地址(代码中
unit=1)必须与Slave设置的站号相同 - 寄存器地址注意:pymodbus v3.x中
read_holding_registers的address参数为0-based,若PC Slave使用1-based地址(比如设置的寄存器地址是300),代码中需改为299
4. 适配pymodbus v3.x版本API
旧视频基于pymodbus v2.x,v3.x已简化API,无需手动指定framer,同时建议增加连接状态检查:
修正后的代码:
from pymodbus.client import ModbusSerialClient client = ModbusSerialClient( method='rtu', port='/dev/ttyUSB0', baudrate=9600, bytesize=8, parity="N", stopbits=1, retries=5, timeout=1, debug=True ) client.strict = False if client.connect(): print("连接成功") # 0-based地址,对应Slave的1-based地址300 res = client.read_holding_registers(address=299, count=1, unit=1) if not res.isError(): print("读取数据:", res.registers) else: print("读取错误:", res) client.close() else: print("连接失败,请检查设备与参数")
5. PC端Slave设置检查
- 在Windows设备管理器中确认CH340对应的COM口,Slave中选择该串口
- 关闭其他占用该串口的程序(如串口助手)
- 若提示设备异常,重新安装CH340 Windows驱动,更换PC端USB口测试
内容的提问来源于stack exchange,提问作者Albert B
相关产品推荐
相关产品推荐

