0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关联接口函数与libmodbus移植

瑞萨MCU小百科 来源: 瑞萨嵌入式小百科 2024-12-30 15:20 次阅读

11.3.7 RTU/TCP关联接口函数

在文件modbus.h的最后位置,有如下语句

#include "modbus-tcp.h"
#include "modbus-rtu.h"

可以发现,除了modbus.h包含的接口函数之外,modbus-rtu.h和modbus-tcp.h也包含了必要的接口函数。

1. RTU模式关联函数

MODBUS_API modbus_t * modbus_new_rtu(const char * device,int baud,char parity,int data_bit,int stop_bit):

此函数的功能是创建一个RTU类型的modbus_t结构体。参数constchar * device代表串口字符串,在Windows操作系统下形态如“COMx”,有一点需要注意的是,对于串口1串口9来说,传递“COM1”“COM9”可以成功,但是如果操作对象为COM10及以上端口,则会出现错误。

产生这种奇怪现象的原因是:微软预定义的标准设备中 含有“COM1”~“COM9”。所以,“COM1”~“COM9”作为文件名传递给函数时操作系统会自动地将之解析为相应的设备。但对于COM10及以上的串口,“COM10”之类的文件名系统只视之为 一般意义上的文件,而非串行设备。为了增加对COM10及以上串行端口的支持,微软规定,如果要访问这样的设备,应使用这样的文件名(以COM10 为例):\. COM10。

所以,使用时在代码中可以如此定义:

const char * device = “\\.\COM10”;

Linux操作系统下可以使用“/dev/ttySo”或“/dev/ttyUSB0”等形式的字符串来表示。而参数int baud表示串口波特率的设置值,例如:9600、19200、57600、115200等。

参数char parity表示奇偶校验位,取值范围:

①‘N’:无奇偶校验;

②‘E’:偶校验;

③‘O’:奇校验。

参数int data_bit表示数据位的长度,取值范围为5、6、7和8。

参数int stop_bit表示停止位长度,取值范围为1或2。

用法举例:

左右滑动查看完整内容

modbus t *ctx;
ctx=modbus_new_rtu("\\.\COM10",115200,'N',8,1);
if (ctx ==NULL)
{
 fprintf(stderr,"Unable to create the libmodbus context
");
 return -1;
 }
modbus_set_slave(ctx,SLAVE_DEVICE_ID);
if (modbus connect(ctx)==-1)
{
 fprintf(stderr,"Connection failed:%s
",modbus_strerror(errno));
 modbus_free(ctx);
 return -1;
}

MODBUS_API int modbus_rtu_set_serial_mode (modbus_t * ctx,int mode):

该函数用于设置串口为MODBUS RTU RS232或MODBUSRTU_RS485模式,此函数只适用于Linux操作系统下。

左右滑动查看完整内容

MODBUS_API int modbus_rtu_set_rts (modbus_t * ctx, int mode)。
MODBUS_API int modbus_rtu_set_custom_rts (modbus_t * ctx, void ( * set_rts) (modbus_t * ctx, int on))。
MODBUS_API int modbus_rtu_set_rts_delay (modbus_t * ctx, int us)。

以上函数只适用于Linux操作系统下,RTS即Request ToSend的缩写,具体的意义可通过网络搜索,一般情况下,此类函数可忽略。

2. TCP模式关联函数

左右滑动查看完整内容

MODBUS_API modbus_t * modbus_new_tcp (const char *ip_address, int port)。

此函数的功能是创建一个TCP/IPv4类型的modbus_t结构体。

参数const char * ip_address为IP地址,port表示远端设备的端口号。

左右滑动查看完整内容

MODBUS_API int modbus_tcp_listen (modbus_t * ctx, int nb_connection)。

此函数创建并监听一个TCP/IPv4上的套接字。

参数int nb_connection代表最大的监听数量,在调用此函数之前,必须首先调用modbus_new_tcp()创建 modbus_t结构体。

MODBUS_API int modbus_tcp_accept(modbus_t * ctx,int * s)。

此函数接收一个TCP/IPv4类型的连接请求,如果成功将进入数据接收状态。

11.4 libmodbus移植

本节源码位于如下目录:

4919789a-c664-11ef-9310-92fbcf53809c.png

11.4.1 编译安装

libmodbus原生就支持Linux,所以不存在移植难度。

如下操作即可编译libmodbus:

左右滑动查看完整内容

$ source /opt/remi-sdk/environment-setup-aarch64-poky-linux
$ tar xzf libmodbus-3.1.10.tar.gz
$ cd libmodbus-3.1.10/
$ ./autogen.sh
$ ./configure --prefix=$PWD/tmp --host=aarch64-poky-linux CFLAGS="-mtune=cortex-a55 
-fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wformat -Wformat-se
curity -Werror=format-security --sysroot=/opt/remi-sdk/sysroots/aa
rch64-poky-linux"
$ make
$ make install
$ ls tmp/
include lib share


// 复制到工具链里
$ sudo cp -rf tmp/include/* /opt/remi-sdk/sysroots/aarch64-poky-linux/usr/include/
$ sudo cp -rfd tmp/lib/* /opt/remi-sdk/sysroots/aarch64-poky-linux/usr/lib64/
$ ls tests/.libs/
bandwidth-client bandwidth-server-one random-test-server unit-test-server
bandwidth-server-many-up random-test-client unit-test-client version

在“tmp/include”目录下生成了有文件,在“tmp/lib”目录下生成了库文件。在“tests/.libs/”目录下生成了测试程序“unit-test-server”、“unit-test-client”。

把库复制到开发板上,在Ubuntu上执行如下命令:

左右滑动查看完整内容

$ scp tmp/lib/*so* root@192.168.5.9:/usr/lib64/

11.4.2 上机测试

把测试程序和库复制到开发板上,在Ubuntu上执行如下命令:

左右滑动查看完整内容

$ scp tests/.libs/unit-test-server root@192.168.5.9:/home/root
$ scp tests/.libs/unit-test-client root@192.168.5.9:/home/root

在开发板上执行如下命令,通过Modbus TCP协议进行测试:

左右滑动查看完整内容

root@myir-remi-1g:~# cd /home/root/
root@myir-remi-1g:~# ./unit-test-server tcp 127.0.0.1 &
root@myir-remi-1g:~# ./unit-test-client tcp 127.0.0.1
Connecting to 127.0.0.1:1502
Client connection accepted from 127.0.0.1.
Waiting for an indication...
** UNIT TESTING **
1/1 No response timeout modification on connect: OK
TEST WRITE/READ:
[00][01][00][00][00][06][FF][05][01][30][FF][00]
<00><01><00><00><00><06><05><01><30><00>
[00][01][00][00][00][06][FF][05][01][30][FF][00]
Waiting for an indication...
Waiting for a confirmation...
<00><01><00><00><00><06><05><01><30><00>
1/2 modbus_write_bit: OK

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    8611

    浏览量

    151263
  • 操作系统
    +关注

    关注

    37

    文章

    6835

    浏览量

    123351
  • 函数
    +关注

    关注

    3

    文章

    4332

    浏览量

    62671
  • LibModbus
    +关注

    关注

    0

    文章

    9

    浏览量

    7258

原文标题:关联接口函数与libmodbus移植 - RZ MPU工业控制教程连载(42)

文章出处:【微信号:瑞萨MCU小百科,微信公众号:瑞萨MCU小百科】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    第6章_libmodbus使用

    libmodbus是一个免费的跨平台支持RTU和TCP的Modbus库,遵循LGPL V2.1+协议。libmodbus支持Linux、Mac Os X、FreeBSD、QNX和Windows等
    的头像 发表于 06-29 14:36 2476次阅读
    第6章_<b class='flag-5'>libmodbus</b>使用

    MAC板labview 互联接口

    MAC板的labview没有互联接口应该怎么办呢,没有办法直接调用键盘?
    发表于 08-10 20:11

    libmodbus使用ubuntu系统

    libmodbus使用ubuntu系统使用libmodbusarm-linux使用libmodbus解压安装移植编译modbus从机模拟ubuntu系统使用libmodbusubuntu系统可以直接
    发表于 11-04 07:57

    基于select操作的libmodbus

    libmodbus库从软件包里启用, libmodbus是基于select操作的,依赖于文件系统和libc,需要在rt-thread中开启对应的支持。一开始以为作为主站时,有函数可以自动的指定读取
    发表于 01-11 08:13

    libmodbus与freemodbus相比有何不同

    背景modbus有主机、从机之分libmodbus与freemodbus相比,是主从机一体的,freemodbus,官方的为从机。libmodbus感觉更适合rt-thread,因为,有了内存的管理
    发表于 02-22 07:00

    libmodbus寄存器个数的疑问

    ,malloc的大小,也是宏定义定义的大小,以状态寄存器来说,就是125个。很多设备的状态寄存器都是远远大于125个的。对于从机的状态寄存器的个数与libmodbus关联,是不是要另外自己写代码进行处理,重新自己写一个modbus_reply
    发表于 06-30 15:39

    浅析基于serialX串口驱动移植libmodbus

    关于 serialX上一篇我们基于 serialX 驱动,移植 freemodbus 并填了几个坑。今天换 libmodbus 看看会遇到什么。测试环境开发板: NK-980IOT V1.0
    发表于 02-15 11:07

    【飞凌i.MX9352开发板试用】 + libmodbus移植 测试 485接口

    ,还用了金升阳的芯片专门进行了隔离,很赞,我们这里通过移植libmodbus库到板子上,硬件上把两个485接口连起来,一主一从进行模拟实际工业上两个设备通过RS485走Modbus RTU协议进行通讯
    发表于 06-14 12:36

    嵌入式linux libmodbus移植

    地址:https://libmodbus.org/版本是3.1.6虚拟机上配置编译./configure --build=i686 --host=arm-fsl-linux-gnueabi --enable-static --prefix=/nfs_root/tools/libm
    发表于 11-01 16:57 9次下载
    嵌入式linux <b class='flag-5'>libmodbus</b>的<b class='flag-5'>移植</b>

    libmodbus之嵌入式Linux使用及测试

    libmodbus使用ubuntu系统使用libmodbusarm-linux使用libmodbus解压安装移植编译modbus从机模拟ubuntu系统使用libmodbusubuntu系统可以直接
    发表于 11-01 16:57 15次下载
    <b class='flag-5'>libmodbus</b>之嵌入式Linux使用及测试

    TI CCS库函数开发最快的DSP工程移植方法

    最近在使用CCS的时候,需要移植TI提供的官方例程,但是发现官方例程所使用的芯片与项目选用的DSP型号并不相同,但是目前的TI DSP均使用DSP库函数开发,基于这一点,就想尝试能否用最快的方法实现
    发表于 12-05 17:36 7次下载
    TI CCS库<b class='flag-5'>函数</b>开发最快的DSP工程<b class='flag-5'>移植</b>方法

    RT-Thread libmodbus RS485 RTU主机调试 - STM32F107VCT6

    背景modbus有主机、从机之分 libmodbus与freemodbus相比,是主从机一体的,freemodbus,官方的为从机。 libmodbus感觉更适合rt-thread,因为,有了内存
    发表于 12-28 19:46 15次下载
    RT-Thread <b class='flag-5'>libmodbus</b> RS485 RTU主机调试 - STM32F107VCT6

    基于serialX串口驱动移植libmodbus的步骤

    之前,笔者介绍 serialX 的时候,曾详细的讲解过 struct rt_uart_ops 接口中的每一个函数的功能。完全按照每一个函数功能定义去做,后面的事情就是水到渠成的。
    发表于 08-10 15:25 702次阅读

    移植libmodbus库到米尔-全志T113-i开发板

    测试开发板在工业领域的应用,modbus作为工业领域的一个重要协议,那好就移植libmodbus库。
    的头像 发表于 03-05 22:37 2521次阅读
    <b class='flag-5'>移植</b><b class='flag-5'>libmodbus</b>库到米尔-全志T113-i开发板

    libmodbus源码框架分析

    libmodbus作为一个优秀且免费开源的跨平台支持RTU 和 TCP模式的Modbus开发库,非常值得大家借鉴和学习。本章对libmodbus源代码进行阅读和分析。
    的头像 发表于 11-21 13:47 387次阅读
    <b class='flag-5'>libmodbus</b>源码框架分析