libmodbus之嵌入式Linux使用及测试

libmodbus之嵌入式Linux使用

  • 1.ubuntu系统使用libmodbus
  • 2.arm-linux使用libmodbus
    • 2.1解压安装
    • 2.2移植编译
    • 2.3modbus从机模拟

1.ubuntu系统使用libmodbus

ubuntu系统可以直接使用apt命令进行库的安装。

sudo apt-get install libmodbus-dev
或者
sudo apt-get install libmodbus5

2.arm-linux使用libmodbus

库参考手册
libmodbus-3.1.4源码

2.1解压安装

tar -xzvf libmodbus-3.1.4.tar.gz
cd libmodbus-3.1.4
# 新建安装文件夹
mkdir -p install
chmod 777 install
./configure --prefix=$(pwd)/install --host=arm-linux --enable-static ac_cv_func_malloc_0_nonnull=yes CC=arm-fsl-linux-gnueabi-gcc
make
make install

2.2移植编译

在我的应用程序工程里面新建一个 libmodbus 文件夹,将上面安装 install目录下的 include和lib文件夹拷贝过来
libmodbus之嵌入式Linux使用及测试_第1张图片
我的工程总体结构如下所示
libmodbus之嵌入式Linux使用及测试_第2张图片
在 mys_src 里面添加 modbus 主机测试程序 modbus_test.c
makefile编写如下所示:

#编译配置,使能为1
CONFIG_MODBUS_BUILD = 1

#当前路径
CUR_DIR := $(shell pwd)

#libmodbus目录
LIBMODBUS_DIR := $(CUR_DIR)/../libmodbus

# 头文件路径
INCLUDE :=
INCLUDE += -I$(CUR_DIR)/../include/
ifeq ($(CONFIG_MODBUS_BUILD), 1)
INCLUDE += -I$(LIBMODBUS_DIR)/include/modbus/
endif

#C编译器的选项
CFLAGS :=
CFLAGS += -g -Wall
CFLAGS += -std=gnu99
CFLAGS += $(INCLUDE)


#库文件参数
LDFLAGS :=
#libmodbus共享库链接
#LDFLAGS += -L$(LIBMODBUS_DIR)/lib
#libmodbus静态库链接
ifeq ($(CONFIG_MODBUS_BUILD), 1)
LDFLAGS += $(LIBMODBUS_DIR)/lib/libmodbus.a
endif


SRCS += modbus_test.c
OBJS += modbus_test.o
BINS += modbus_test


all:$(OBJS) $(BINS) 

$(OBJS):%.o:%.c
    $(CC) -c $(CFLAGS) $^ -o $(OBJ_DIR)/$@

$(BINS):$(OBJS)
    $(CC) -o $(BIN_DIR)/$@ $(OBJ_DIR)/$^ $(LDFLAGS)

modbus_test.c

#include 
#include 
#include 
#include 
#include 
#include 

#define MODBUS_DEV_NAME    "/dev/ttymxc3"    ///< 串口设备

int main(void)
{
    modbus_t *ctx =NULL;

    // 以串口的方式创建libmobus实例,并设置参数
    ctx = modbus_new_rtu(MODBUS_DEV_NAME, 115200, 'N', 8, 1);
    if (ctx == NULL)                //使用UART4,对应的设备描述符为ttymxc3
    {
        fprintf(stderr, "Unable to allocate libmodbus contex\n");
        return -1;
    }
    // 使用RS485时需考虑设置串口模式、RTS引脚等
//    modbus_rtu_set_serial_mode(MODBUS_RTU_RS485);    //设置串口模式

    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;
    }

    int i,rc;
    uint16_t tab_reg[64] = {0}; //定义存放数据的数组
    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(5000000);
    }
    modbus_close(ctx);  //关闭modbus连接
    modbus_free(ctx);   //释放modbus资源,使用完libmodbus需要释放掉

    return 0;
}

编译之后可通过nfs挂载进行测试

2.3modbus从机模拟

Modbus slave测试工具可以用来做modbus从机设备,从而实现arm控制板通过串口与PC端模拟的modbus从机进行通信测试。
libmodbus之嵌入式Linux使用及测试_第3张图片
然后设置 setup->slave definition 从机ID、设置为保存寄存器,10条
libmodbus之嵌入式Linux使用及测试_第4张图片
同时我们也给寄存器设置一些值
libmodbus之嵌入式Linux使用及测试_第5张图片
开发板运行测试程序后,成功读取modbus从机寄存器值
libmodbus之嵌入式Linux使用及测试_第6张图片

你可能感兴趣的:(Linux)