【Linux】NUC977移植使用libmodbus

简介: 【Linux】NUC977移植使用libmodbus

前言

**  

相关简介:

  libmodbus是一个快速、跨平台的Modbus库,目前支持Linux, Mac OS X, FreeBSD, QNX和Windows系统,可以与使用Modbus协议的设备进行数据发送/接收的库,该库包含各种后端以支持通过不同网络进行通信(例如,RTU模式下的串口或TCP / IPv6中的以太网),libmodbus提供了较低通信层的抽象,并在所有支持的平台上提供相同的API;文末提供一份libmodbus官方手册中文翻译文档。

完成目标:

  1,完成libmodbus库的编译

  2,编写基于libmodbus的程序

  3,编译,烧录和运行**


一、libmodbus库的编译

新唐交叉编译器:arm-nuvoton-linux-uclibceabi

# 解压libmodbus
tar -zvxf libmodbus-3.1.7.tar.gz
#进入目录
cd libmodbus-3.1.7
# 配置文件 --host的参数是交叉编译器的前缀,也就是不加gcc或者g++的名字这里根据自己的交叉编译器调整
# --prefix的参数是最终编译动态链接库是安装到那个位置,这个还是比较重要后面我们要使用该动态库链接进行交叉编译,这里的目录一定要提前创建好
./configure   --host=arm-nuvoton-linux-uclibceabi     --prefix=/home/stylle/01_nuc977/03.tools/libmodbus-3.1.7/install

到这里然后执行make编译完成后make install,然后我们进入installl目录将lib文件夹下库文件全部拷贝到开发板的/lib文件夹下,到此开发板的移植的工作就完成了,下面开始程序的编写和运行。(这里编译的库还可以使用file指令查看是否位arm专用)

二、程序的编写运行

Makefile的编写:需要修改的地方就只有编译的时候libmodbus库文件存放的位置路径需要跟自己对应

.SUFFIXES : .x .o .c .s
CC := arm-linux-gcc
STRIP := arm-linux-strip
TARGET = libmodbus
SRCS := libmodbus.c
LIBPATH += -I /opt/libmodbus/include/modbus/
LIBPATH += -L /opt/libmodbus/lib/
LIBS = -lmodbus
all:
     $(CC) $(SRCS) -o $(TARGET) $(LIBPATH) $(LIBS)
     $(STRIP) $(TARGET) 
clean:
     rm -f *.o
     rm -f *.x
     rm -f *.flat
     rm -f *.map
     rm -f temp
     rm -f *.img
     rm -f $(TARGET)
     rm -f *.gdb

libmodbus.c

#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <stdint.h>
#include <errno.h>
#include <modbus.h>
#include <string.h>
void *modbus_entry(void *arg)
{
   uint16_t tab_reg[64] = {0};
   modbus_t *ctx = NULL;
   ctx = modbus_new_rtu("/dev/tty10", 115200, 'N', 8, 1);
   modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS232);
   modbus_set_slave(ctx, 1);
   modbus_connect(ctx);
   modbus_set_response_timeout(ctx, 1, 0);  // 2s
   while (1)
   {
     static int num = 0;
     memset(tab_reg, 0, 64 * 2);
     int regs = modbus_read_registers(ctx, 0x00, 2, tab_reg);
     if(regs == 1)
     {
       printf("[%d]read reg:%d %d\r\n", tab_reg[0], tab_reg[1]);
     }
     else
     {
       printf("read error\r\n");
       break;
     }
     usleep(5000);
   }
   //7-关闭modbus端口
   modbus_close(ctx);
   //8-释放modbus资源
   modbus_free(ctx);
}
int main(int argc, char *argv[])
{
    pthread_t modbus_thread;
    pthread_create(&modbus_thread,NULL, modbus_entry, NULL);
    pthread_join(modbus_thread, NULL);
    return 0;
}

然后执行make编译将生成的libmosbu文件拷贝到开发板中执行即可,具体的libmodbus可以参考官方手册中文翻译(见后文链接下载);

最后

对于Linux开发的基本流程都是相同的,这个流程同样可以应用在其他Linux开发板子上使用。

libmodbus库下载:https://libmodbus.org/download/

libmodbus中文翻译文档:「libmodbus官方手册中文翻译.pdf


相关文章
|
6月前
|
存储 编解码 Ubuntu
【QT】linux下alsa库的移植和QT中音视频的处理&笔记
【QT】linux下alsa库的移植和QT中音视频的处理&笔记
|
6月前
|
网络协议 Linux 编译器
【原创】EtherCAT主站IgH解析(二)-- 如何将Igh移植到Linux/Windows/RTOS等多操作系统移植指南
EtherCAT主站方案对比:商业的如Acontis、TwinCAT3和开源的igh、SOEM。SOEM易移植但功能和实时性不足,适合简单应用;igh功能强大,实时性能优秀,基于内核态,适合复杂场景。igh能移植到其他RTOS,但需克服多任务无调度的挑战。依赖操作系统服务如定时器、内存分配,适合Linux内核,但移植到裸机复杂。
266 0
|
7月前
|
Linux 编译器 网络安全
嵌入式Linux移植dropbear
嵌入式Linux移植dropbear
241 3
|
7月前
|
JSON Ubuntu Linux
LuaJit交叉编译移植到ARM Linux
LuaJit交叉编译移植到ARM Linux
149 1
|
7月前
|
Linux 编译器 测试技术
嵌入式 Linux 下的 LVGL 移植
嵌入式 Linux 下的 LVGL 移植
253 0
|
7月前
|
Linux 计算机视觉
Linux交叉编译opencv并移植ARM端
通过以上步骤,你可以在Linux上交叉编译OpenCV,并将生成的库文件和头文件移植到ARM平台上,从而在ARM上使用OpenCV。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
477 0
|
7月前
|
编解码 Ubuntu 算法
【Linux】NUC977移植使用MQTT(基于mosquitto)
【Linux】NUC977移植使用MQTT(基于mosquitto)
|
22天前
|
监控 Linux
如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
本文介绍了在Linux系统中检查内存使用情况的5个常用命令:`free`、`top`、`vmstat`、`pidstat` 和 `/proc/meminfo` 文件,帮助用户准确监控内存状态,确保系统稳定运行。
131 6
|
23天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
64 3
|
23天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
59 2