c++ 写一个基于rs485 modbus 客服端于服务端
时间: 2023-12-15 08:32:42 浏览: 35
以下是一个基于C++的RS485 Modbus通讯协议的客户端和服务端示例代码:
客户端代码:
```cpp
#include <iostream>
#include <string>
#include <modbus.h>
int main() {
modbus_t *ctx;
uint16_t tab_reg[32];
// 创建Modbus上下文
ctx = modbus_new_rtu("/dev/ttyUSB0", 9600, 'N', 8, 1);
if (ctx == NULL) {
std::cerr << "无法创建Modbus上下文" << std::endl;
return -1;
}
// 设置从机地址
modbus_set_slave(ctx, 1);
// 连接到从机
if (modbus_connect(ctx) == -1) {
std::cerr << "无法连接到从机" << std::endl;
modbus_free(ctx);
return -1;
}
// 读取保持寄存器
int rc = modbus_read_registers(ctx, 0, 10, tab_reg);
if (rc == -1) {
std::cerr << "读取保持寄存器失败" << std::endl;
modbus_close(ctx);
modbus_free(ctx);
return -1;
}
// 打印读取的数据
for (int i = 0; i < rc; ++i) {
std::cout << "保持寄存器 " << i << ": " << tab_reg[i] << std::endl;
}
// 断开连接并释放资源
modbus_close(ctx);
modbus_free(ctx);
return 0;
}
```
服务端代码:
```cpp
#include <iostream>
#include <string>
#include <modbus.h>
int main() {
modbus_t *ctx;
uint16_t tab_reg[32] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A};
// 创建Modbus上下文
ctx = modbus_new_rtu("/dev/ttyUSB0", 9600, 'N', 8, 1);
if (ctx == NULL) {
std::cerr << "无法创建Modbus上下文" << std::endl;
return -1;
}
// 设置从机地址
modbus_set_slave(ctx, 1);
// 连接到从机
if (modbus_connect(ctx) == -1) {
std::cerr << "无法连接到从机" << std::endl;
modbus_free(ctx);
return -1;
}
// 写入保持寄存器
int rc = modbus_write_registers(ctx, 0, 10, tab_reg);
if (rc == -1) {
std::cerr << "写入保持寄存器失败" << std::endl;
modbus_close(ctx);
modbus_free(ctx);
return -1;
}
std::cout << "成功写入 " << rc << " 个保持寄存器" << std::endl;
// 断开连接并释放资源
modbus_close(ctx);
modbus_free(ctx);
return 0;
}
```
请根据实际的串口设备路径和Modbus参数进行修改。同时,确保已经安装了libmodbus库,并将编译命令中添加-lmodbus选项。这只是一个简单的示例,你可以根据具体需求进行更多的功能开发和错误处理。