树莓派4使用minimalmodbus读取Geolux传感器报非法函数码错误
Geolux RSS-2-300WL流量传感器Modbus通信错误排查(功能码4非法)
问题背景
使用Raspberry Pi 4 Model B通过minimalmodbus库与Geolux RSS-2-300WL流量传感器通信,串口参数配置为波特率9600、数据位8、偶校验、停止位1、超时1秒,尝试用功能码4读取寄存器地址0x0012时,触发报错:ErrorSlave reported illegal function。
核心原因(基于设备手册)
该传感器仅支持Modbus功能码3(读取保持寄存器),不支持功能码4(读取输入寄存器)。水位数据存储在保持寄存器0x0012(十进制18),为32位浮点数,需连续读取起始地址0x0012的2个寄存器。
修正后的代码
#!/usr/bin/env python3 import minimalmodbus import serial import time # 传感器配置 geolux = minimalmodbus.Instrument('/dev/ttySC0', 1) # 串口路径、从站ID geolux.serial.baudrate = 9600 geolux.serial.bytesize = 8 geolux.serial.parity = serial.PARITY_EVEN geolux.serial.stopbits = 1 geolux.serial.timeout = 1 geolux.clear_buffers_before_each_transaction = True # 清除串口缓冲区,避免残留数据干扰 # 主读取循环 try: while True: try: # 读取32位浮点数水位值(从保持寄存器0x0012开始,读2个寄存器) water_level = geolux.read_float(registeraddress=0x0012, functioncode=3, number_of_registers=2) print(f"当前水位: {water_level}") time.sleep(1) # 每秒读取一次 except Exception as e: print(f"读取失败: {str(e)}") time.sleep(1) except KeyboardInterrupt: print("程序已终止")
额外排查建议
- 确认从站ID:传感器默认ID为1,若已通过配置工具修改,需同步调整代码中的从站ID参数。
- 检查硬件连接:使用RS485适配器时,确保A/B线与传感器对应引脚正确连接,且树莓派与传感器共地。
- 测试串口连通性:可使用
minicom或screen工具直接发送Modbus指令,验证硬件链路是否正常。
内容的提问来源于stack exchange,提问作者user28387204
相关产品推荐
相关产品推荐

