龙芯技术社区
直播中

jf_15811252

3年用户 248经验值
擅长:嵌入式技术
私信 关注
[2K系列]

【龙芯2K0300蜂鸟板试用】+4.libmodbus移植

1.libmodbus简介

libmodbus是一个用于实现Modbus通信协议的开源库。Modbus是一种在工业自动化领域广泛使用的通信协议,libmodbus为开发人员提供了一套灵活而强大的工具,用于创建Modbus主机(master)和从机(slave)应用。该库支持Modbus RTU、Modbus ASCII和Modbus TCP,覆盖串行通信和基于TCP/IP的通信。libmodbus是跨平台的,可在Linux、Windows和其他类Unix系统上运行。它不仅提供了主机和从机的支持,还通过其灵活的API允许开发人员自定义通信行为。此外,libmodbus提供示例代码和支持多种编程语言,包括C和Python。这使得开发人员能够快速集成Modbus通信功能,并借助社区支持,确保其应用程序的稳定性和可靠性。总体而言,libmodbus为实现Modbus通信的开发者提供了一个可靠、易用的工具集。

2.实现步骤

新建文件,拉取libmodbus源码,地址如下:

https://github.com/stephane/libmodbus
image.png

在这个目录下新建一个文件夹用于存放生产的Makefile文件,并添加可执行权限
image.png

输入命令:

./configure --host=loongarch64-linux-gnu --enable-static --prefix=$(pwd)/install/
image.png

然后开始编译,输入make
image.png

编译完成后就开始安装,输入make install
image.png

查看生成的文件:
image.png

接下来将编译的库传递到开发板,传递这里直接使用scp远程上传就行
image.png

添加一个测试程序,如下所示:

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
#include"modbus.h"  //modbus动态库文件

int main(intargc, char *argv[])
{
      uint16_t tab_reg[64] = {0}; //定义存放数据的数组
    modbus_t *ctx = NULL;
    int rc;
    int i;
      //以串口的方式创建libmobus实例,并设置参数
      ctx = modbus_new_rtu("/dev/ttyS3",115200, '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;
}

编译生成可执行文件,并将文件传递到开发板,添加执行权限
image.png

接下来连接各Modbus设备,或者通过软件模拟一个设备就可以了。
image.png

更多回帖

发帖
×
20
完善资料,
赚取积分