我目前正在尝试从我的 Arduino slave 接收数据到我的计算机。我成功地创建了一个 Arduino 奴隶。但是,当我尝试使用 Pymodbus 库从我的计算机接收数据时,我的代码无法从 Arduino 接收数据并引发 ModbusIOException。对于我的项目的规范,我正在尝试使用 Arduino 构建一个 Modbus RTU 来模拟一个以随机数作为读数的传感器。Arduino 代码使用 Andre Sarmento 的 Modbus-Arduino 库。
https://github.com/andresarmento/modbus-arduino
我已经检查了我的 Arduino 奴隶是否工作正常。我尝试通过 Modbus Master 仿真器 (QModMaster) 读取数据,它工作得很好。这可能证明问题本身来自于 Master 的代码。此外,串行连接似乎工作正常,因为 self.client.connect() 返回 True。
这些是 QModMaster 配置的屏幕截图。
大师的Python代码:
class ModbusRTU:
def __init__(self, graph_name, port, baudrate=9600,
stopbits=1, bytesize=8, parity='N',
timeout=1):
self.graph_name = graph_name
self.client = ModbusSerialClient(method='rtu',
port=port,
baudrate=baudrate,
parity=parity,
timeout=timeout)
self.connection = self.client.connect()
result = self.client.read_holding_registers(address=0,
count=2,
unit=1)
print(result.registers)
if __name__ == '__main__':
modbus = ModbusRTU(graph_name='/dev/ttyACM0',
port='/dev/ttyACM0', baudrate=9600,
stopbits=1, bytesize=8, parity='N',
timeout=1)
print(modbus.check_connection())
模拟从机和传感器的 Arduino 代码:
#include <Modbus.h>
#include <ModbusSerial.h>
ModbusSerial mb;
const int READING = 0;
const int DECIMAL = 1;
void setup() {
mb.config(&Serial, 9600, SERIAL_8N1);
mb.setSlaveId(1);
mb.addHreg(READING);
mb.addHreg(DECIMAL);
}
void loop() {
mb.task();
mb.Hreg(READING, random(1, 201));
mb.Hreg(DECIMAL, random(0, 4));
}
在打印 时results.registers
,它应该是一个整数列表。但是,它只会引发 ModbusIOException 并显示以下消息:
'ModbusIOException' object has no attribute 'registers'
File "/home/kebaranas/PythonProjects/ThirsyWell/tools/utilities.py", line 21, in __init__
print(result.registers)
File "/home/kebaranas/PythonProjects/ThirsyWell/tools/utilities.py", line 29, in <module>
timeout=1)
它也给出了这个信息。
Modbus Error: [Input/Output] Modbus Error: [Invalid Message] Incomplete message received, expected at least 2 bytes (0 received)