序
在Linux上移植modbus rtu,开发平台用的周立功imx6ul开发板,总结了网上一些方法,记录下以供之后参考学习。
参考链接:
https://www.cnblogs.com/happybirthdaytoyou/p/11301612.html
一、Libmodbus RTU
1、去libmodbus官网下载源码,目前更新到V3.1.6
链接:https://libmodbus.org/download/
2、交叉编译
①、复制到指定目录下解压
xhb@xhb-virtual-machine:~/modbus_file$ pwd
/home/xhb/modbus_file
xhb@xhb-virtual-machine:~/modbus_file$ ls
libmodbus-3.1.6.tar.gz
xhb@xhb-virtual-machine:~/modbus_file$ tar -zxvf libmodbus-3.1.6.tar.gz
②、创建安装目录
③、配置编译选项
进入解压目录后
#./configure --host=[交叉编译工具链前缀] --enable-static --prefix=[安装路径]/install/
xhb@xhb-virtual-machine:~/modbus_file/libmodbus-3.1.6$ ./configure --host=arm-linux-gnueabihf --enable-static --prefix=/home/xhb/modbus_file/install/
④、编译
make
⑤、安装
make install
若出现了错误:
…/libtool: line 1102: arm-none-linux-gnueabi-ranlib: command not found
make[2]: *** [install-libLTLIBRARIES] Error 127
make[2]: Leaving directory `/usr/local/modbus/libmodbus-3.0.6/src’
make[1]: *** [install-am] Error 2
make[1]: Leaving directory `/usr/local/modbus/libmodbus-3.0.6/src’
make: *** [install-recursive] Error 1
解决方法:
执行sudo –i,执行完之后会自动切换到/root目录。所以需要切换回之前的目录,执行make install,就可以成功
3、将动态链接库复制到开发板
将install/lib文件夹下的libmodbus.so、libmodbus.so.5、libmodbus.so.5.1.0复制到ARM开发板的/usr/lib目录下。
可以用NFS将文件夹挂载到ARM板上较为方便
参考链接:https://blog.csdn.net/qq_40690943/article/details/115248971?spm=1001.2014.3001.5501
[root@EPC-M6Y2C lib]# cp libmodbus.so* /usr/lib
直接复制可能会报错,加 wr 解决
[root@EPC-M6Y2C lib]# wr cp libmodbus.so* /usr/lib
4、测试程序
1、创建一个.c文件,并添加以下内容
/*************************
**
** modbus-rtu-test.c
** 移植libmodbus库到ARM开发板,并测试成功
**
**************************/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include "modbus.h" //modbus动态库文件
int main(int argc, char *argv[])
{
uint16_t tab_reg[64] = {0}; //定义存放数据的数组
modbus_t *ctx = NULL;
int rc;
int i;
//以串口的方式创建libmobus实例,并设置参数
ctx = modbus_new_rtu("/dev/ttymxc1", 115200, 'N', 8, 1);
if (ctx == NULL) //使用UART1,对应的设备描述符为ttyS1
{
fprintf(stderr, "Unable to allocate libmodbus contex\n");
return -1;
}
modbus_set_debug(ctx, 1); //设置1可看到调试信息
modbus_set_slave(ctx, 1); //设置slave ID
if (modbus_connect(ctx) == -1) //等待连接设备
{
fprintf(stderr, "Connection failed:%s\n", modbus_strerror(errno));
return -1;
}
while (1)
{
printf("\n----------------\n");
rc = modbus_read_registers(ctx, 0, 10, tab_reg);
if (rc == -1) //读取保持寄存器的值,可读取多个连续输入保持寄存器
{
fprintf(stderr,"%s\n", modbus_strerror(errno));
return -1;
}
for (i=0; i<10; i++)
{
printf("reg[%d] = %d(0x%x)\n", i, tab_reg[i], tab_reg[i]);
}
usleep(3000000);
}
modbus_close(ctx); //关闭modbus连接
modbus_free(ctx); //释放modbus资源,使用完libmodbus需要释放掉
return 0;
}
2、将install/include/modbus/中的头文件复制到.c文件一个目录中
xhb@xhb-virtual-machine:~/modbus_file/modbus_rtu_program$ cd ../install/include/modbus/
xhb@xhb-virtual-machine:~/modbus_file/install/include/modbus$ ls
modbus.h modbus-rtu.h modbus-tcp.h modbus-version.h
xhb@xhb-virtual-machine:~/modbus_file/install/include/modbus$ cp modbus* /home/xhb/modbus_file/modbus_rtu_program/
3、交叉编译
xhb@xhb-virtual-machine:~/modbus_file/modbus_rtu_program$ arm-linux-gnueabihf-gcc modbus_rtu_test.c -o modbus_rtu_test -L /home/xhb/modbus_file/install/lib/ -lmodbus
4、将可执行文件复制到ARM板下
5、PC端设置
1、安装Modbus Poll和Modbus Slave
2、打开Modbus Slave
按照程序配置信息
6、运行程序
1、运行
2、success