1. 初始化串口
在使用 ModbusRTU
类之前,需要先初始化串口。以下是一个示例代码:
cpp复制
// 初始化 ModbusRTU 对象
ModbusRTU modbus;// 配置串口参数
modbus.initializePort("COM5", 115200); // 使用 COM5 和波特率 115200
modbus.setDeviceAddress(0x01); // 设置设备地址为 0x01
2. 写入单个寄存器
如果你想写入一个单个寄存器,可以使用以下方法:
cpp复制
// 发送设定压力值(330 kPa)
uint16_t setPressure = 330; // 设定压力值
bool success = modbus.writeSingleRegister(0x0002, setPressure); // 写入寄存器地址 0x0002,值为 330if (success) {qDebug() << "Pressure set successfully to:" << setPressure << "kPa";
} else {qDebug() << "Failed to set pressure.";
}
3. 读取保持寄存器
如果你需要读取保持寄存器的值,可以使用以下方法:
cpp复制
// 读取当前压力值(假设位于寄存器地址 0x0003)
uint16_t currentPressure;
std::vector<uint16_t> values;if (modbus.readHoldingRegisters(0x0003, 1, values)) {currentPressure = values[0];qDebug() << "Current pressure:" << currentPressure << "kPa";
} else {qDebug() << "Failed to read pressure.";
}
4. 写入多个寄存器
如果需要写入多个寄存器,可以使用以下方法:
cpp复制
// 构造要写入的寄存器值
std::vector<uint16_t> values = {100, 200, 300};// 写入多个寄存器
bool success = modbus.writeMultipleRegisters(0x0004, values); // 写入寄存器地址 0x0004,值为 100、200、300if (success) {qDebug() << "Multiple registers written successfully.";
} else {qDebug() << "Failed to write multiple registers.";
}
5. 关闭串口
在程序结束时,确保关闭串口以释放资源:
cpp复制
// 关闭串口
modbus.serialPort->close();
6. 错误处理
ModbusRTU
类通过信号 errorOccurred
和 portOpened
发送串口操作的结果。你可以在连接这些信号后进行相应的处理:
cpp复制
// 连接误差信号
connect(&modbus, &ModbusRTU::errorOccurred, [](const QString &error) {qDebug() << "Error occurred:" << error;
});// 连接串口打开信号
connect(&modbus, &ModbusRTU::portOpened, [](bool opened) {qDebug() << "Serial port opened:" << opened;
});
7. 示例代码
以下是一个完整的示例代码,展示了如何使用 ModbusRTU
类进行 Modbus 通信:
cpp复制
#include "modbusrtu.h"
#include <QCoreApplication>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);// 初始化 ModbusRTUModbusRTU modbus;modbus.initializePort("COM5", 115200); // 连接 COM5 端口,波特率为 115200modbus.setDeviceAddress(0x01); // 设置设备地址为 0x01// 发送设定压力值(330 kPa)uint16_t setPressure = 330;bool writeSuccess = modbus.writeSingleRegister(0x0002, setPressure);if (writeSuccess) {qDebug() << "Pressure set successfully to:" << setPressure << "kPa";} else {qDebug() << "Failed to set pressure.";}// 读取当前压力值std::vector<uint16_t> values;bool readSuccess = modbus.readHoldingRegisters(0x0003, 1, values);if (readSuccess) {qDebug() << "Current pressure:" << values[0] << "kPa";} else {qDebug() << "Failed to read pressure.";}// 关闭串口modbus.serialPort->close();return app.exec();
}
总结
-
初始化:使用
initializePort
方法配置串口参数。 -
通信:使用
writeSingleRegister
、readHoldingRegisters
和writeMultipleRegisters
方法进行 Modbus 通信。 -
错误处理:通过连接
errorOccurred
和portOpened
信号来处理串口操作的结果。 -
资源管理:在程序结束时,确保关闭串口以释放资源。