树莓派3B+搭配Waveshare RS485 CAN HAT(B)时minimalmodbus校验和错误排查
解决Modbus RTU校验和错误及波特率异常问题
一、消除Checksum Error的步骤
1. 修正串口波特率匹配问题
传感器仅支持1200-115200波特率,当前dmesg显示ttySC0的波特率为921600(超出传感器支持范围),这是导致校验和错误的核心原因。即使传感器有响应,也是波特率不匹配下的乱码反馈。
- 临时修改串口波特率:执行命令
(9600可替换为传感器支持的其他波特率,如19200、38400等)stty -F /dev/ttySC0 9600 cs8 parenb -cstopb - 永久修改:编辑
/boot/config.txt,调整Waveshare HAT的串口配置参数,确保波特率落在1200-115200区间内,具体参考Waveshare官方驱动配置文档。
2. 确认寄存器读取的功能码与类型
MP Filtri ICM传感器的寄存器0若为输入寄存器(通常产品ID这类只读信息会存于输入寄存器),则需使用read_input_register而非read_register(后者默认对应功能码03,用于保持寄存器)。修改代码中的读取逻辑:
# 替换原读取行 prodid = instrument.read_input_register(0, 0) # 输入寄存器读取,功能码04
3. 验证串口参数一致性
确保代码中串口参数与传感器手册完全匹配:
- 偶校验:
instrument.serial.parity = minimalmodbus.serial.PARITY_EVEN(已正确设置) - 8数据位、1停止位:当前代码设置正确,无需修改
- 超时时间:可尝试调整为1秒(
instrument.serial.timeout = 1),避免因传感器响应慢导致数据截断
4. 排查硬件连接细节
- 确认RS485的A/B线无接反(传感器A接HAT的A,传感器B接HAT的B)
- 检查共地是否可靠:确保树莓派、HAT、传感器的地线直接连通,避免浮地导致信号干扰
- 测试电源稳定性:24VDC电源需满足传感器和HAT的功率需求,可尝试单独为传感器供电(仍保持共地)
二、为何仅921600波特率能得到响应
Waveshare RS485 CAN HAT(B)使用SC16IS752串口扩展芯片,驱动默认配置的波特率为921600。传感器的波特率自动识别功能本应仅响应1200-115200的速率,但在非标准波特率下,可能因信号电平触发了传感器的通信检测机制,导致传感器返回乱码数据——这种“响应”并非正常通信,而是信号误触发,因此会出现校验和错误。
内容的提问来源于stack exchange,提问作者Farizno
相关产品推荐
相关产品推荐

