linux libmodbus的移植

1.前言

Modbus是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。

2.移植步骤
  • 第一,进入libmodbus目录下,在交叉编译器是最好加上–prefix参数,叫相关的库直接集中起来,方便拷贝到开发板相应的目录中去;
    嵌入式开发板:

    #./configure --build=i686 --host=arm-none-linux-gnueabi --enable-static --prefix=/root/libmodbus-3.1.1/install/ && make install
    

    x86机器 :

    #./configure && make install
    
  • 第二,进入libmodbus/test目录,修改unit-test-client.c (modbus主机测试) 中的”/dev/ttyUSB1”,改成你测试的串口设备号

    ctx = modbus_new_rtu("/dev/ttyUSB1", 115200, 'N', 8, 1);
    

    同样地,修改unit-test-server.c (modbus从机测试) 中的”/dev/ttyUSB0”,改成你测试的串口设备号

    ctx = modbus_new_rtu("/dev/ttyUSB0", 115200, 'N', 8, 1);
    

    改好后重先进行编译

    #make clean
    #make all
    

    编译完后就生成了unit-test-client,unit-test-server两个可执行文件,

  • 第三,运行两个程序

    #./unit-test-client
    #./unit-test-server
    
3.测试

总体测试图
这里写图片描述
主机测试信息
这里写图片描述
从机测试信息
这里写图片描述
注:在test目录下的类似unit-test-server这个不是可执行文件,而是一个脚本,他会调用test目录下的.lib/下的unit-test-server可执行文件。在PC中需要执行对应的脚本文件,而在嵌入式平台上却是执行可执行文件;

4.自定义代码测试主机
4.1 测试对象

modbus主机 -> linux -> unit-test-client
modbus从机 -> windows -> modbus slave

4.2 代码修改

修改unit-test-client.c程序

 int main(int argc, char *argv[])
{
    uint8_t *tab_rp_bits;
    uint16_t *tab_rp_registers;
    uint16_t *tab_rp_registers_bad;
    uint16_t tab_reg[64];
    modbus_t *ctx;
    int i;
    uint8_t value;
    int nb_points;
    int rc;
    float real;
    uint32_t ireal;
    struct timeval old_response_timeout;
    struct timeval response_timeout;
    int use_backend;

    ctx = modbus_new_rtu("/dev/ttyUSB0", 115200, 'E', 8, 1);

    if (ctx == NULL) {
        fprintf(stderr, "Unable to allocate libmodbus context\n");
        return -1;
    }
    modbus_set_debug(ctx, TRUE);

    modbus_set_slave(ctx, 1);

    if (modbus_connect(ctx) == -1) {
        fprintf(stderr, "Connection failed: %s\n",
                modbus_strerror(errno));
        modbus_free(ctx);
        return -1;
    }

   while(1)
   {
       printf("--------------------\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",14,tab_reg[i],tab_reg[i]);
      }
      usleep(1000000);
   }


     modbus_close(ctx);
     modbus_free(ctx);
     return 0;
}
4.3 重新编译运行
#make clean
#make all
#./unit-test-client
4.4 测试对比分析

打开windows下的modbus slave,设置好相关参数,如下图
这里写图片描述
那么linux端的modbus主机打印信息
这里写图片描述
结论:数据吻合,测试正常

libmodbus是一个开源的Modbus通信库,可以用于在多种平台上实现Modbus通信功能。如果要将libmodbus移植到单片机上,首先需要了解单片机的硬件平台和软件环境。 1. 硬件平台:单片机通常具有有限的资源,如处理器速度、存储器容量和IO口数量。在移植libmodbus之前,需要确认单片机的硬件资源是否能够满足libmodbus的要求。 2. 操作系统:单片机上可能没有标准的操作系统,而是运行裸机程序。在移植libmodbus之前,需要根据单片机的特点选择适当的操作系统或者裸机编程方式。 3. 编译器:单片机的编程通常使用特定的编译器。在移植libmodbus之前,需要确认单片机所支持的编译器,并进行必要的配置。 移植libmodbus到单片机的具体步骤如下: 1. 下载libmodbus库代码,并解压到单片机的开发环境中。 2. 根据单片机的硬件平台和软件环境,修改libmodbus的配置文件,例如头文件路径、编译选项等。 3. 修改libmodbus的源代码,以适应单片机的特殊需求。可能需要对底层的串口通信、定时器等进行相应的修改和适配。 4. 进行编译和链接,生成适用于单片机的可执行文件。 5. 在单片机上运行测试程序,验证libmodbus的功能和稳定性。 6. 在实际应用中,根据具体的需求,结合libmodbus的API进行二次开发,实现自己所需的Modbus通信功能。 总之,将libmodbus移植到单片机上需要根据单片机的硬件平台和软件环境进行适当的配置和修改,以满足单片机的特殊需求和资源限制。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值