玩转Libmodbus(一) 搭建开发环境

先转载一片文章先,主要是参考了其搭建环境的部分:

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开发板测试程序接收到的数据
 
 

江湖很大,你我相遇在此有一定缘分,可以考虑加个QQ群聊聊人生,技术离不开生活,生活离不开聊聊。

 

 

.

posted @ 2019-08-05 10:45  一匹夫  阅读(18967)  评论(2编辑  收藏  举报