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

RTU模式下双EM340电表连接时MinimalModbus校验和错误求助

问题描述

使用树莓派通过USB CH340适配器连接单台EM340电能表时,代码运行正常。但连接两台EM340电能表(已按官方手册完成接线)时,出现RTU模式下的校验和错误,错误日志如下:

pi@raspberrypi:~ $ python3 modbus_test.py
Traceback (most recent call last):
  File "modbus_test.py", line 21, in <module>
    freq2 = instrument.read_register(0x0033,1)  # Registernumber, number of decimals
  File "/home/pi/.local/lib/python3.7/site-packages/minimalmodbus.py", line 486, in read_register
    payloadformat=_Payloadformat.REGISTER,
  File "/home/pi/.local/lib/python3.7/site-packages/minimalmodbus.py", line 1245, in _generic_command
    payload_from_slave = self._perform_command(functioncode, payload_to_slave)
  File "/home/pi/.local/lib/python3.7/site-packages/minimalmodbus.py", line 1330, in _perform_command
    response, self.address, self.mode, functioncode
  File "/home/pi/.local/lib/python3.7/site-packages/minimalmodbus.py", line 1867, in _extract_payload
    raise InvalidResponseError(text)
minimalmodbus.InvalidResponseError: Checksum error in rtu mode: '6ý' instead of '\x99ò' . The response is: '\x01\x01\x00\x00\x166ý' (plain response: '\x01\x01\x00\x00\x166ý')

测试代码如下:

import minimalmodbus
import serial

instrument = minimalmodbus.Instrument('/dev/ttyUSB0', 1)  # port name, slave address (in decimal)

#instrument.serial.port                     # this is the serial port name
instrument.serial.baudrate = 9600         # Baud
instrument.serial.bytesize = 8
#instrument.serial.parity   = serial.PARITY_NONE
instrument.serial.stopbits = 1
instrument.serial.timeout  = 0.2          # seconds

instrument.address = 1                         # this is the slave address number
#instrument.mode = minimalmodbus.MODE_ASCII   # rtu or ascii mode
instrument.mode = minimalmodbus.MODE_RTU
instrument.clear_buffers_before_each_transaction = True
instrument.close_port_after_each_call = True


## Read data ##
freq2 = instrument.read_register(0x0033,1)  # Registernumber, number of decimals
txt = "Frekvens: {} Hz".format(freq2)

kwh_total  = instrument.read_register(0x0400)
kwh_total_2  = instrument.read_register(0x0402)
txt2 = "Total forbrug: {0}.{1} kWh".format(kwh_total,kwh_total_2)

w_l1 = instrument.read_register(0x0012,1)  # Registernumber, number of decimals
txt3 = "Nuværende forbrug: {} W".format(w_l1)

print(txt)
print(txt2)
print(txt3)

请问为何会出现RTU模式下的校验和错误?


可能的原因及解决办法
  • 从站地址冲突:两台EM340默认Modbus地址大概率都是1,发送请求时两台设备会同时响应,返回的数据混杂在一起,直接导致校验和不匹配。进入电能表设置界面,将两台设备的地址修改为不同值(比如1和2),代码中分别创建对应地址的minimalmodbus.Instrument实例访问每台设备。
  • 总线缺少终端电阻:Modbus RTU是半双工总线,多设备连接时总线两端必须接120Ω终端电阻抑制信号反射,否则信号畸变会导致数据传输错误。检查电能表接线端子,启用终端电阻(部分设备需手动短接对应端子)。
  • 串口参数不匹配:确认两台电能表的串口参数(波特率、奇偶校验、停止位)和代码设置完全一致。代码中注释了serial.PARITY_NONE,但EM340默认可能为偶校验,需核对设备手册后开启对应设置,避免参数不一致导致数据解析错误。
  • 串口缓冲区残留数据:虽然代码开启了clear_buffers_before_each_transaction,但多设备环境下可能仍有残留响应数据干扰后续请求。可以延长串口超时时间(比如设为0.5秒),给设备足够响应传输时间;也可在每次请求前手动调用instrument.serial.reset_input_buffer()清空缓冲区。
  • 适配器或供电稳定性问题:部分廉价CH340适配器在多设备场景下可能出现信号丢包或干扰,建议更换质量可靠的USB转串口适配器。另外,树莓派供电不足会导致串口信号不稳定,确保使用足够功率的电源给树莓派供电。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:35:13