libmodbus库的交叉编译:
1】到libmodbus官网https://libmodbus.org/download/下载安装包,内部自带configure文件,官网推荐v3.1.6稳定版。
另外注意,如果是从github上克隆源码的,则包里没有configure文件,需要额外安装部分软件,才能生成configure脚本。
github下载需要安装额外软件(官网下载跳过):
sudo apt install autoconf
sudo apt install automake
sudo apt install libtool
./autogen.sh
即可生成configure文件。
2】解压安装包:tar zxvf libmodbus-3.1.6.tar.gz
3】进入安装包:cd libmodbus-3.1.6
4】创建文件夹,存放编译输出:mkdir install
5】source交叉编译环境变量:source ~/Downloads/neoway-arm-oe-linux/neoway-env-init.sh,根据实际目录调整
6】配置交叉编译器:./configure --host=arm-oe-linux-gnueabi --enable-static --prefix=/home/a/gitlab-ws/libmodbus-3.1.6/install/,注意prefix目录改为第4】步创建的目录(pwd命令可查看路径,复制即可)
7】make
8】make install
这样就会在刚刚创建的install文件夹下,看到include,lib,以备主程序调用。
将lib下的3个动态库libmodbus.so.x.x,项目所在环境的/usr/lib目录。
使用:
在项目makefile文件中 -L./lib -lmodbus 在调用函数的c文件中引入.h文件
modbus的初始化对象操作和设置参数
ctx = modbus_new_rtu("/dev/ttyHSL0", 9600, 'N', 8, 1); //set slave modbus addr defalut is 3 modbus_set_slave(ctx, 3); //set modbus timeout 3s modbus_set_response_timeout(ctx, 3, 0); //sec,usec,超时设置 设置为3s //modbus_set_byte_timeout(ctx, 0, 800*1000);//800ms if (modbus_connect(ctx) == -1) { fprintf(stderr, "Connection failed: %s ", modbus_strerror(errno)); modbus_free(ctx); return -1; }
modbus读取输入寄存器实例
uint16_t inv_data_buf[125] = {0}; //每帧最多125个寄存器,官方规定 memset(inv_data_buf, 0, sizeof(inv_data_buf)); int len =modbus_read_input_registers(ctx, 1000, 56, inv_data_buf); //1000 56 if (len < 0) { printf("[error] read 3x registers: (%d) ", len); return -1; }