0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)聯(lián)接口函數(shù)與libmodbus移植

瑞薩MCU小百科 ? 來源: 瑞薩嵌入式小百科 ? 2024-12-30 15:20 ? 次閱讀

11.3.7 RTU/TCP關(guān)聯(lián)接口函數(shù)

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

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

可以發(fā)現(xiàn),除了modbus.h包含的接口函數(shù)之外,modbus-rtu.h和modbus-tcp.h也包含了必要的接口函數(shù)。

1. RTU模式關(guān)聯(lián)函數(shù)

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

此函數(shù)的功能是創(chuàng)建一個RTU類型的modbus_t結(jié)構(gòu)體。參數(shù)constchar * device代表串口字符串,在Windows操作系統(tǒng)下形態(tài)如“COMx”,有一點需要注意的是,對于串口1串口9來說,傳遞“COM1”“COM9”可以成功,但是如果操作對象為COM10及以上端口,則會出現(xiàn)錯誤。

產(chǎn)生這種奇怪現(xiàn)象的原因是:微軟預(yù)定義的標(biāo)準(zhǔn)設(shè)備中 含有“COM1”~“COM9”。所以,“COM1”~“COM9”作為文件名傳遞給函數(shù)時操作系統(tǒng)會自動地將之解析為相應(yīng)的設(shè)備。但對于COM10及以上的串口,“COM10”之類的文件名系統(tǒng)只視之為 一般意義上的文件,而非串行設(shè)備。為了增加對COM10及以上串行端口的支持,微軟規(guī)定,如果要訪問這樣的設(shè)備,應(yīng)使用這樣的文件名(以COM10 為例):\. COM10。

所以,使用時在代碼中可以如此定義:

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

Linux操作系統(tǒng)下可以使用“/dev/ttySo”或“/dev/ttyUSB0”等形式的字符串來表示。而參數(shù)int baud表示串口波特率的設(shè)置值,例如:9600、19200、57600、115200等。

參數(shù)char parity表示奇偶校驗位,取值范圍:

①‘N’:無奇偶校驗;

②‘E’:偶校驗;

③‘O’:奇校驗。

參數(shù)int data_bit表示數(shù)據(jù)位的長度,取值范圍為5、6、7和8。

參數(shù)int stop_bit表示停止位長度,取值范圍為1或2。

用法舉例:

左右滑動查看完整內(nèi)容

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):

該函數(shù)用于設(shè)置串口為MODBUS RTU RS232或MODBUSRTU_RS485模式,此函數(shù)只適用于Linux操作系統(tǒng)下。

左右滑動查看完整內(nèi)容

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)。

以上函數(shù)只適用于Linux操作系統(tǒng)下,RTS即Request ToSend的縮寫,具體的意義可通過網(wǎng)絡(luò)搜索,一般情況下,此類函數(shù)可忽略。

2. TCP模式關(guān)聯(lián)函數(shù)

左右滑動查看完整內(nèi)容

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

此函數(shù)的功能是創(chuàng)建一個TCP/IPv4類型的modbus_t結(jié)構(gòu)體。

參數(shù)const char * ip_address為IP地址,port表示遠(yuǎn)端設(shè)備的端口號。

左右滑動查看完整內(nèi)容

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

此函數(shù)創(chuàng)建并監(jiān)聽一個TCP/IPv4上的套接字。

參數(shù)int nb_connection代表最大的監(jiān)聽數(shù)量,在調(diào)用此函數(shù)之前,必須首先調(diào)用modbus_new_tcp()創(chuàng)建 modbus_t結(jié)構(gòu)體。

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

此函數(shù)接收一個TCP/IPv4類型的連接請求,如果成功將進(jìn)入數(shù)據(jù)接收狀態(tài)。

11.4 libmodbus移植

本節(jié)源碼位于如下目錄:

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

11.4.1 編譯安裝

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

如下操作即可編譯libmodbus:

左右滑動查看完整內(nèi)容

$ 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


// 復(fù)制到工具鏈里
$ 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”。

把庫復(fù)制到開發(fā)板上,在Ubuntu上執(zhí)行如下命令:

左右滑動查看完整內(nèi)容

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

11.4.2 上機(jī)測試

把測試程序和庫復(fù)制到開發(fā)板上,在Ubuntu上執(zhí)行如下命令:

左右滑動查看完整內(nèi)容

$ 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

在開發(fā)板上執(zhí)行如下命令,通過Modbus TCP協(xié)議進(jìn)行測試:

左右滑動查看完整內(nèi)容

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8612

    瀏覽量

    151302
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6838

    瀏覽量

    123384
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4333

    瀏覽量

    62696
  • LibModbus
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    7260

原文標(biāo)題:關(guān)聯(lián)接口函數(shù)與libmodbus移植 - RZ MPU工業(yè)控制教程連載(42)

文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    第6章_libmodbus使用

    libmodbus是一個免費的跨平臺支持RTU和TCP的Modbus庫,遵循LGPL V2.1+協(xié)議。libmodbus支持Linux、Mac Os X、FreeBSD、QNX和Windows等
    的頭像 發(fā)表于 06-29 14:36 ?2500次閱讀
    第6章_<b class='flag-5'>libmodbus</b>使用

    MAC板labview 互聯(lián)接口

    MAC板的labview沒有互聯(lián)接口應(yīng)該怎么辦呢,沒有辦法直接調(diào)用鍵盤?
    發(fā)表于 08-10 20:11

    libmodbus使用ubuntu系統(tǒng)

    libmodbus使用ubuntu系統(tǒng)使用libmodbusarm-linux使用libmodbus解壓安裝移植編譯modbus從機(jī)模擬ubuntu系統(tǒng)使用libmodbusubuntu系統(tǒng)可以直接
    發(fā)表于 11-04 07:57

    基于select操作的libmodbus

    libmodbus庫從軟件包里啟用, libmodbus是基于select操作的,依賴于文件系統(tǒng)和libc,需要在rt-thread中開啟對應(yīng)的支持。一開始以為作為主站時,有函數(shù)可以自動的指定讀取
    發(fā)表于 01-11 08:13

    libmodbus與freemodbus相比有何不同

    背景modbus有主機(jī)、從機(jī)之分libmodbus與freemodbus相比,是主從機(jī)一體的,freemodbus,官方的為從機(jī)。libmodbus感覺更適合rt-thread,因為,有了內(nèi)存的管理
    發(fā)表于 02-22 07:00

    libmodbus寄存器個數(shù)的疑問

    ,malloc的大小,也是宏定義定義的大小,以狀態(tài)寄存器來說,就是125個。很多設(shè)備的狀態(tài)寄存器都是遠(yuǎn)遠(yuǎn)大于125個的。對于從機(jī)的狀態(tài)寄存器的個數(shù)與libmodbus關(guān)聯(lián),是不是要另外自己寫代碼進(jìn)行處理,重新自己寫一個modbus_reply
    發(fā)表于 06-30 15:39

    淺析基于serialX串口驅(qū)動移植libmodbus

    關(guān)于 serialX上一篇我們基于 serialX 驅(qū)動,移植 freemodbus 并填了幾個坑。今天換 libmodbus 看看會遇到什么。測試環(huán)境開發(fā)板: NK-980IOT V1.0
    發(fā)表于 02-15 11:07

    【飛凌i.MX9352開發(fā)板試用】 + libmodbus移植 測試 485接口

    ,還用了金升陽的芯片專門進(jìn)行了隔離,很贊,我們這里通過移植libmodbus庫到板子上,硬件上把兩個485接口連起來,一主一從進(jìn)行模擬實際工業(yè)上兩個設(shè)備通過RS485走M(jìn)odbus RTU協(xié)議進(jìn)行通訊
    發(fā)表于 06-14 12:36

    嵌入式linux libmodbus移植

    地址:https://libmodbus.org/版本是3.1.6虛擬機(jī)上配置編譯./configure --build=i686 --host=arm-fsl-linux-gnueabi --enable-static --prefix=/nfs_root/tools/libm
    發(fā)表于 11-01 16:57 ?9次下載
    嵌入式linux <b class='flag-5'>libmodbus</b>的<b class='flag-5'>移植</b>

    libmodbus之嵌入式Linux使用及測試

    libmodbus使用ubuntu系統(tǒng)使用libmodbusarm-linux使用libmodbus解壓安裝移植編譯modbus從機(jī)模擬ubuntu系統(tǒng)使用libmodbusubuntu系統(tǒng)可以直接
    發(fā)表于 11-01 16:57 ?15次下載
    <b class='flag-5'>libmodbus</b>之嵌入式Linux使用及測試

    TI CCS庫函數(shù)開發(fā)最快的DSP工程移植方法

    最近在使用CCS的時候,需要移植TI提供的官方例程,但是發(fā)現(xiàn)官方例程所使用的芯片與項目選用的DSP型號并不相同,但是目前的TI DSP均使用DSP庫函數(shù)開發(fā),基于這一點,就想嘗試能否用最快的方法實現(xiàn)
    發(fā)表于 12-05 17:36 ?7次下載
    TI CCS庫<b class='flag-5'>函數(shù)</b>開發(fā)最快的DSP工程<b class='flag-5'>移植</b>方法

    RT-Thread libmodbus RS485 RTU主機(jī)調(diào)試 - STM32F107VCT6

    背景modbus有主機(jī)、從機(jī)之分 libmodbus與freemodbus相比,是主從機(jī)一體的,freemodbus,官方的為從機(jī)。 libmodbus感覺更適合rt-thread,因為,有了內(nèi)存
    發(fā)表于 12-28 19:46 ?15次下載
    RT-Thread <b class='flag-5'>libmodbus</b> RS485 RTU主機(jī)調(diào)試 - STM32F107VCT6

    基于serialX串口驅(qū)動移植libmodbus的步驟

    之前,筆者介紹 serialX 的時候,曾詳細(xì)的講解過 struct rt_uart_ops 接口中的每一個函數(shù)的功能。完全按照每一個函數(shù)功能定義去做,后面的事情就是水到渠成的。
    發(fā)表于 08-10 15:25 ?708次閱讀

    移植libmodbus庫到米爾-全志T113-i開發(fā)板

    測試開發(fā)板在工業(yè)領(lǐng)域的應(yīng)用,modbus作為工業(yè)領(lǐng)域的一個重要協(xié)議,那好就移植libmodbus庫。
    的頭像 發(fā)表于 03-05 22:37 ?2534次閱讀
    <b class='flag-5'>移植</b><b class='flag-5'>libmodbus</b>庫到米爾-全志T113-i開發(fā)板

    libmodbus源碼框架分析

    libmodbus作為一個優(yōu)秀且免費開源的跨平臺支持RTU 和 TCP模式的Modbus開發(fā)庫,非常值得大家借鑒和學(xué)習(xí)。本章對libmodbus源代碼進(jìn)行閱讀和分析。
    的頭像 發(fā)表于 11-21 13:47 ?404次閱讀
    <b class='flag-5'>libmodbus</b>源碼框架分析