前言
**
相关简介:
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」