这篇文章是转载的,我主要是参考了其搭建环境的部分。

转载自:

https://blog.csdn.net/qq_40452910/article/details/88560310

一、源码下载

1、libmodbus官网

https://libmodbus.org/download/

2、下载

选择长期稳定版本libmodbus-3.0.6.tar.gz

二、交叉编译

1、解压

拷贝到相应目录,解压,例如拷贝在/usr/local/modbus下,modbus目录需要自己创建

tar   -zxvf   libmodbus-3.0.6.tar.gz

2、创建安装目录

mkdir   install

3、进入解压的目录

cd  libmodbus-3.0.6

4、配置编译选项

(注:--prefix选项是安装目录,根据自己环境确定)

./configure   --host=[交叉编译工具链前缀]   --enable-static   --prefix=[安装路径]/install/

[安装路径]例如/usr/local/modbus,[交叉编译工具链]例如arm-none-linux-gnueabi

5、编译

make

6、安装

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,就可以成功。

7、生成动态链接库

在install生成三个目录:include  lib  share

lib文件夹中的libmodbus.so、libmodbus.so.5、libmodbus.so.5.0.5就是动态链接库

三、移植到ARM开发板

1、复制文件到ARM开发板

将libmodbus.so、libmodbus.so.5、libmodbus.so.5.0.5复制到ARM开发板中的/usr/lib目录下

执行cp   libmodbus.so*   /usr/lib(常用的动态链接库,存放在该目录下)会出现无法创建的问题(cannot create ‘/usr/lib/libmodbus.so*’: Read-only file system)。

解决方法:执行 wr  cp  libmodbus*  /usr/lib

四、创建测试程序

1、创建测试程序C文件

在PC机linux系统下新建.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/ttyS1", 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、复制库中头文件

将/usr/local/modbus/install/include/modbus中的四个头文件modbus.h、modbus-rtu.h、modbus-tcp.h、modbus-version.h复制到上边C语言文件同一文件夹。

3、交叉编译

arm-none-linux-gnueabi-gcc   test.c   -o   test   -L   /usr/local/modbus/install/lib/   -lmodbus

4、复制可执行文件到开发板

将可执行程序文件test复制到ARM开发板的文件夹下。

五、安装ModbusPoll及ModbusSlave

六、测试

1、测试准备

在执行上述步骤前,需要先连接好相应的硬件,比如串口线等,然后打开ModBus调试助手,设置好波特率等,设置要与上述程序中的保持一致。

ModBus调试助手相关设置

2、在ARM上运行test程序

若出现错误:./test: error while loading shared libraries: libmodbus.so.5: cannot open shared object file: Error 20

解决方法:将libmodbus.so、libmodbus.so.5、libmodbus.so.5.0.5三个动态链接库复制到当前文件下,就可以正常执行。

3、移植成功

发现ModBus调试助手与开发板数据可以正常传输,测试成功,如图。

ModBus调试助手发送数据界面
ARM开发板测试程序接收到的数据

最新文章

  1. hibernate 入门
  2. Activity 生命周期
  3. 漫谈可视化Prefuse(三)---Prefuse API数据结构阅读有感
  4. 【Android开发学习笔记】【第二课】Activity学习
  5. MongoDB探索之路(一)——入门
  6. DATE,DATETIME,DATETIME2等日期时间数据类型
  7. poj3114Countries in War(缩点+DIJK)
  8. Head First 设计模式系列之二----备忘录模式(java版)
  9. UVA10562 数据结构题目
  10. CentOS7 安装spark集群
  11. [vue最新实战] gank客户端(vue2 + vue-router2 + vuex +webpace + es6)新手福利,干货多多
  12. 『转』MarsEdit快速插入源代码
  13. 选择客栈noip2011
  14. C#图解教程 第十三章 委托
  15. ASP.NET Core 实现带认证功能的Web代理服务器
  16. JGUI源码:实现日期控件显示(17)
  17. golang Mysql -- Tx
  18. MySQL 数据库 初识
  19. 访问内网(https,udp)
  20. secureCRT修改背景色、字体颜色

热门文章

  1. 焦大:做seo需要的三心二意
  2. Java中解析wav音频文件信息:音频声道数,采样频率,采样位数、声音尺寸
  3. 力扣Leetcode 200. 岛屿数量
  4. APM姿态控制流程
  5. 为什么建议软件测试自学而不推荐去IT培训机构?浅谈IT培训机构存在的意义
  6. android Studio(3.2.1) NDK配置
  7. [BUUOJ记录] [极客大挑战 2019]RCE ME
  8. es6使用箭头函数需要注意的问题
  9. openshift搭建私有registry
  10. 小程序里的request