【Linux】移植Libmodbus RTU

在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
在这里插入图片描述在这里插入图片描述

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
STM32是一款功能强大的微控制器系列,它的硬件资源和丰富的开发工具使得移植Modbus RTU相对简单。Modbus RTU是一种常用的串行通信协议,用于在工业自动化系统中传输数据。下面就是移植Modbus RTU到STM32的步骤: 1. 确定硬件资源:在开始移植之前,需要确定STM32芯片上的串口资源。Modbus RTU通常使用RS485或RS232串口进行通信。选择合适的串口资源,并确保它们的引脚分配和外设配置正确。 2. 导入Modbus库文件:在STM32项目中,导入适用于Modbus RTU协议的库文件。例如可以使用开源的modbus库,这个库提供了Modbus RTU的通信协议和相关函数,方便我们在STM32上实现Modbus通信。 3. 配置串口:在初始化过程中,配置串口的参数,例如波特率、数据位、停止位和校验位等。这些参数需要与Modbus RTU设备的通信参数相匹配。 4. 实现Modbus协议:根据Modbus RTU协议的规范,实现相关的通信函数。这些函数通常包括发送和接收数据的操作。在STM32上,可以利用串口中断来处理Modbus RTU通信。 5. 实现Modbus功能码:根据自己的需求,实现Modbus RTU的功能码,例如读取和写入保持寄存器、读取和写入输入寄存器等。这些功能码需要根据Modbus RTU设备的协议进行实现。 6. 编写应用程序:根据具体的应用场景,编写应用程序来操作Modbus设备。例如,读取传感器数据或者控制执行器等。 移植Modbus RTU到STM32的过程中,需要充分理解Modbus RTU协议的规范和要求,并根据具体情况进行相应的配置和程序开发。合理利用STM32的硬件资源和开发工具,可以快速实现Modbus RTU通信功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值