一. 安装libmodbus库
首先安装libmodbus库,可以通过包管理器安装,或者通过源代码编译。
包管理器安装:
sudo apt-get install libmodbus-dev
从源代码安装,确保已经安装了git工具:
# 从github上拉取源代码
git clone https://github.com/stephane/libmodbus.git
# 进入到源代码的目录下
cd libmodbus
# 编译并安装,先确保autogen.sh有可执行权限
# 如果没有执行权限先执行
su chmod +x autogen.sh
# 运行sh脚本生成
./autogen.sh
./configure
# 编译并安装libmidbus库
make
sudo make install
二. 确认安装是否成功
方法一,通过dpkg工具查看是否存在libmodbus库
dpkg -s libmodbus-dev
方法二,检查库路径
默认情况下libmodbus的头文件和库文件位于以下路径:
头文件:/usr/include/modbus.h
库文件:/usr/lib/x86_64-linux-gnu/libmodbus.so
ls /usr/include/modbus.h
ls /usr/lib/x86_64-linux-gnu/libmodbus.so
三、libmodbus使用流程
# 第一步,创建Modbus RTU连接
modbus_t *mb = modbus_new_rtu("/dev/ttyUSB0", 9600, 'N', 8, 1);
"/dev/ttyUSB0":串口号
9600: 波特率
'N': 校验方式,O(奇校验)/E(偶校验)/N(无校验)
8: 数据位
1: 停止位
# 第二步,设置从机地址
modbus_set_slave(mb, 1);
mb: 第一步创建的modbus对象
1: 设备的从机地址
# 第三步,设置超时时间
modbus_set_response_timeout(mb, &timeout);
timeout:时间结构体
struct timeval timeout;
timeout.tv_sec = 1;
timeout.tv_usec = 0;
# 第四步,连接
modbus_connect(mb)
#第五步,采集
modbus_read_registers(mb, 0, 10, tab_reg);
0: 开始采集的起始地址
10: 采集的长度
tab_reg: 保存采集到的数据
四、使用例子
//example.cpp
#include <modbus/modbus.h>
#include <iostream>
#include <stdexcept>
int main() {
// 创建Modbus RTU连接
modbus_t *mb = modbus_new_rtu("/dev/ttySUB0", 9600, 'N', 8, 1);
if (mb == nullptr) {
std::cerr << "Unable to create the libmodbus context" << std::endl;
return -1;
}
//设置从机地址为1
if (modbus_set_slave(mb, 1)){
std::cerr << "Unable to set slave" << std::endl;
modbus_free(mb);
return -1;
}
// 设置Modbus通信超时
struct timeval timeout;
timeout.tv_sec = 1;
timeout.tv_usec = 0;
modbus_set_response_timeout(mb, &timeout);
// 连接Modbus
if (modbus_connect(mb) == -1) {
std::cerr << "Unable to connect to the Modbus server" << std::endl;
modbus_free(mb);
return -1;
}
// 读取保持寄存器(功能代码0x03)
uint16_t tab_reg[32]; // 存储寄存器数据
int rc = modbus_read_registers(mb, 0, 10, tab_reg); // 从地址0读取10个寄存器
if (rc == -1) {
std::cerr << "Modbus read error" << std::endl;
modbus_free(mb);
return -1;
}
// 打印读取到的寄存器值
std::cout << "Read registers:" << std::endl;
for (int i = 0; i < 10; i++) {
std::cout << "Register " << i << ": " << tab_reg[i] << std::endl;
}
// 写入寄存器(功能代码0x06)
uint16_t value = 100;
rc = modbus_write_register(mb, 1, value); // 向地址1写入数据12345
if (rc == -1) {
std::cerr << "Modbus write error" << std::endl;
modbus_free(mb);
return -1;
}
// 关闭连接
modbus_close(mb);
modbus_free(mb);
return 0;
}
五、编译并运行代码
编译时一定要链接libmodbus库,即添加-lmodbus参数,否则编译不过。
# 编译编写好的代码,生成example程序
g++ example.cpp -o example -lmodbus
# 运行example程序
./example



2407

被折叠的 条评论
为什么被折叠?



