Libmodbus - Linux(ARM)
在Linux上移植libmodbus(RTU及TCP),开发板用的RK3288,总结了网上一些方法,记录下以供之后参考学习。。
一、libmodbus官网下载源码
下载地址: link.
二、交叉编译
1.复制到指定目录下并解压
解压:
tar -zxvf libmodbus-3.1.4.tar.gz
2.创建安装目录
mkdir install
chmod 777 install
3.配置编译选项
进入解压目录后
// 进入libmodbus解压目录
cd ./libmodbus-3.1.4
// ./configure --host=[交叉编译工具链前缀] --enable-static --prefix=[安装路径]/install/
./configure --host=arm-linux-gnueabihf --enable-static --prefix=/opt/install/
4.编译
make
5.安装
make install
三、将动态链接库复制到开发板
将install/lib文件夹下的libmodbus.so、libmodbus.so.5、libmodbus.so.5.1.0复制到ARM开发板的/usr/lib目录下。 可以用NFS将文件夹挂载到ARM板上/WinSCP工具等(比较方便)
cd ..
cd ./install/lib/
cp libmodbus.so* /usr/lib
直接复制可能会报错,加 wr 解决
wr cp libmodbus.so* /usr/lib
四、测试程序
1.创建一个ModbusRTU_Test.c文件,并添加以下内容
#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/ttyS0", 9600, 'N', 8, 1);
if (ctx == NULL)
{
fprintf(stderr, "Unable to allocate libmodbus contex\n");
return -1;
}
modbus_set_debug(ctx, 1); //设置1可看到调试信息
modbus_set_slave(ctx, 7); //设置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/中的头文件复制到与ModbusRTU_Test.c文件一个目录中
人比较懒,直接拷贝了
3.编译
gcc -o ModbusRTU_Test ModbusRTU_Test.c -lmodbus
// arm-linux-gnueabihf-gcc ModbusRTU_Test.c -o ModbusRTU_Test -L opt/install/lib/ -lmodbus
四.将可执行文件复制到ARM板下,运行测试
1.复制、赋权限
// 我复制的路径
cd /opt/test/.
// 设置权限
chmod 755 ModbusRTU_Test
2. 运行
3.UART ttyS0接个485设备或使用Modbus Slave模拟个设备
再次运行
|