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

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

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

RT-Thread中Agile Modbus軟件包的使用方法

冬至子 ? 來(lái)源:YZRD ? 作者:YZRD ? 2023-10-11 15:37 ? 次閱讀

開(kāi)發(fā)環(huán)境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的資源包為0.2.2,Agile Modbus軟件包版本為v1.1.2。工程使用上一篇 RT-Thread中RS485驅(qū)動(dòng)包的使用 工程為基礎(chǔ)。

單片機(jī)作為主站Master,從站使用軟件Modbus Slave模擬

打開(kāi)工程,添加軟件包Agile Modbus,添加成功,先進(jìn)行編譯,查看是否有錯(cuò)誤。編譯正常。

根據(jù)Agile Modbus軟件包的文檔介紹,

  • 主機(jī):
  • 1.agile_modbus_rtu_init / agile_modbus_tcp_init 初始化 RTU/TCP 環(huán)境
  • 2.agile_modbus_set_slave 設(shè)置從機(jī)地址
  • 3.清空接收緩存
  • 4.agile_modbus_serialize_xxx 打包請(qǐng)求數(shù)據(jù)
  • 5.發(fā)送數(shù)據(jù)
  • 6.等待數(shù)據(jù)接收結(jié)束
  • 7.agile_modbus_deserialize_xxx 解析響應(yīng)數(shù)據(jù)
  • 8.用戶處理得到的數(shù)據(jù)

參考代碼為

#include
#include
#include "rs485.h"
#include
#define DBG_TAG "rtu_master"
#define DBG_LVL DBG_INFO
#include
int main(void)
{
rs485_init();
uint8_t ctx_send_buf[AGILE_MODBUS_MAX_ADU_LENGTH];
uint8_t ctx_read_buf[AGILE_MODBUS_MAX_ADU_LENGTH];
uint16_t hold_register[10];
agile_modbus_rtu_t ctx_rtu;
agile_modbus_t *ctx = &ctx_rtu._ctx;
agile_modbus_rtu_init(&ctx_rtu, ctx_send_buf, sizeof(ctx_send_buf), ctx_read_buf, sizeof(ctx_read_buf));
agile_modbus_set_slave(ctx, 1);
LOG_I("Running.");
while (1)
{
rt_thread_mdelay(100);
int send_len = agile_modbus_serialize_read_registers(ctx, 0, 10);
rs485_send(ctx->send_buf, send_len);
int read_len = rs485_receive(ctx->read_buf, ctx->read_bufsz, 1000, 20);
if (read_len == 0)
{
LOG_W("Receive timeout.");
continue;
}
int rc = agile_modbus_deserialize_read_registers(ctx, read_len, hold_register);
if (rc < 0)
{
LOG_W("Receive failed.");
if (rc != -1)
LOG_W("Error code:%d", -128 - rc);
continue;
}
LOG_I("Hold Registers:");
for (int i = 0; i < 10; i++)
LOG_I("Register [%d]: 0x%04X", i, hold_register[i]);
rt_kprintf("rnrnrn");
}
}

因?yàn)槲覀兪褂玫氖莚s485驅(qū)動(dòng)包,根據(jù)例程,我們知道需要增加幾個(gè)函數(shù),如下:

static int Bsp_Rs485_init(void); //Rs485初始化+設(shè)置超時(shí)時(shí)間
static int Bsp_Rs485_Tx(uint8_t *buf,int size); //Rs485 發(fā)送
static int Bsp_Rs485_Rx(uint8_t *buf,int size); //Rs485接受

根據(jù)例程,修改主函數(shù)modbus后的代碼如下:

#include
#include
#include "rs485.h"
#include
#define DBG_TAG "rtu_master"
#define DBG_LVL DBG_INFO
#include
int main(void)
{
Bsp_Rs485_init();//
uint8_t ctx_send_buf[AGILE_MODBUS_MAX_ADU_LENGTH];
uint8_t ctx_read_buf[AGILE_MODBUS_MAX_ADU_LENGTH];
uint16_t hold_register[10];
agile_modbus_rtu_t ctx_rtu;
agile_modbus_t *ctx = &ctx_rtu._ctx;
agile_modbus_rtu_init(&ctx_rtu, ctx_send_buf, sizeof(ctx_send_buf), ctx_read_buf, sizeof(ctx_read_buf));
agile_modbus_set_slave(ctx, 1);
LOG_I("Running.");
while (1)
{
rt_thread_mdelay(100);
int send_len = agile_modbus_serialize_read_registers(ctx, 0, 10);
Bsp_Rs485_Tx(ctx->send_buf, send_len);//
int read_len = Bsp_Rs485_Rx(ctx->read_buf, ctx->read_bufsz);//
if (read_len == 0)
{
LOG_W("Receive timeout.");
continue;
}
int rc = agile_modbus_deserialize_read_registers(ctx, read_len, hold_register);
if (rc < 0)
{
LOG_W("Receive failed.");
if (rc != -1)
LOG_W("Error code:%d", -128 - rc);
continue;
}
LOG_I("Hold Registers:");
for (int i = 0; i < 10; i++)
LOG_I("Register [%d]: 0x%04X", i, hold_register[i]);
rt_kprintf("rnrnrn");
}
}

編譯正常,下載到開(kāi)發(fā)板。

打開(kāi)模擬軟件Modbus Slave,設(shè)置基本參數(shù)。Modbus Slave的使用參考:參考
可以看到輸出端口打印出了從站數(shù)據(jù)的信息。

1.jpg

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

    關(guān)注

    54

    文章

    8378

    瀏覽量

    147717
  • ModBus協(xié)議
    +關(guān)注

    關(guān)注

    3

    文章

    179

    瀏覽量

    33702
  • RS485接口
    +關(guān)注

    關(guān)注

    2

    文章

    62

    瀏覽量

    14310
  • STM32F407
    +關(guān)注

    關(guān)注

    15

    文章

    188

    瀏覽量

    29821
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1321

    瀏覽量

    40845
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    RT-Thread記錄(十八、SHT21與24C02軟件包

    本文學(xué)習(xí)測(cè)試一下幾款典型設(shè)備的 RT-Thread I2C軟件包
    的頭像 發(fā)表于 07-08 11:07 ?3748次閱讀
    <b class='flag-5'>RT-Thread</b>記錄(十八、SHT21與24C02<b class='flag-5'>軟件包</b>)

    使用menuconfig配置基于RT-Thread的NimBLE軟件包

    最近在學(xué)習(xí) RT-Thread 的 NimBLE 軟件包,使用 menuconfig 配置選中 NimBLE 軟件包,設(shè)置各種選項(xiàng)后,成功通過(guò)編譯并且運(yùn)行起來(lái)。不過(guò)這僅僅只是按照文檔
    發(fā)表于 06-27 11:18

    基于RT-Thread實(shí)現(xiàn)的Agile Modbus協(xié)議棧

    mcu_demos  在 AT32F437 上基于 RT-Thread 實(shí)現(xiàn)的支持 Modbus 固件升級(jí)的 Bootloader:AT32F437_Boot  在 HPM6750 上
    發(fā)表于 10-08 15:04

    RT-ThreadAgile Modbus軟件包的使用

    開(kāi)發(fā)環(huán)境:野火的stm32f407,rt-thread studio版本為版本: 2.2.6,stm32f4的資源為0.2.2,Agile Modbus
    發(fā)表于 02-10 16:46

    RT-Thread的mymqtt軟件包添加步驟與使用方法

    文章 RT-ThreadLan8720和lwip協(xié)議棧的使用的工程基礎(chǔ)上添加mymqtt軟件包。使能mqtt example和mqtt test,保存,等待下載更新軟件包。編譯,本以
    發(fā)表于 02-13 14:58

    RT-Thread Studio安裝軟件包agile-modbus后編譯出現(xiàn)arm-none-eabi-gcc: fatal錯(cuò)誤

    軟件包,選擇agile_modbus,保存setting,自動(dòng)下載庫(kù)文件 3,點(diǎn)擊“重新構(gòu)建項(xiàng)目”,出現(xiàn)如下錯(cuò)誤: linking… arm-none-eabi-gcc: fatal error
    發(fā)表于 09-08 15:34

    RT-Thread 軟件包介紹

    RT-Thread 軟件包介紹軟件包的目的軟件包在高級(jí)語(yǔ)言中非常常見(jiàn),很多高級(jí)語(yǔ)言都有對(duì)應(yīng)的軟件包平臺(tái),比如 Python 的 PyPi,R
    發(fā)表于 05-21 19:38 ?5600次閱讀

    RT-Thread軟件包定義和使用

    RT-Thread軟件包是運(yùn)行于RT-Thread物聯(lián)網(wǎng)操作系統(tǒng)平臺(tái)上,面向不同應(yīng)用領(lǐng)域的通用軟件組件 。RT-Thread 同時(shí)提供了開(kāi)放
    的頭像 發(fā)表于 05-21 11:29 ?1.1w次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>軟件包</b>定義和使用

    RT-Thread社區(qū)上有哪些優(yōu)秀的軟件包?

    SX12XX 軟件包是基于 semtech 官網(wǎng) Firmware Drivers V2.1.0代碼庫(kù)的移植實(shí)現(xiàn),目前只支持 SX1278 LoRa設(shè)備。該軟件包在原代碼庫(kù)功能的基礎(chǔ)上,對(duì)接 RT-Thread SPI 設(shè)備驅(qū)動(dòng)
    的頭像 發(fā)表于 04-03 15:35 ?7790次閱讀

    2022 RT-Thread全球技術(shù)大會(huì):RT-Thread軟件包

    RT-Thread在2022年上半年新增幾十個(gè)軟件包:rtt-rust、LuatOS、gui-guider-demo。
    的頭像 發(fā)表于 05-27 14:12 ?1132次閱讀
    2022 <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):<b class='flag-5'>RT-Thread</b><b class='flag-5'>軟件包</b>

    RT-Thread全球技術(shù)大會(huì):恩智浦新增100+軟件包

    RT-Thread全球技術(shù)大會(huì):恩智浦新增100+軟件包,支持了很多有用的功能。 ? ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 14:26 ?1039次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):恩智浦新增100+<b class='flag-5'>軟件包</b>

    RT-Thread在線軟件包改為本地軟件包方法

    RT-Thread軟件包,使用時(shí)需要手動(dòng)通過(guò) ENV 工具 更新到 本地的 packages 目錄,并且 packages 目錄默認(rèn)不參與 Git 工程管理,軟件包多了,偶爾需要更改軟件包
    的頭像 發(fā)表于 08-11 15:02 ?1397次閱讀
    <b class='flag-5'>RT-Thread</b>在線<b class='flag-5'>軟件包</b>改為本地<b class='flag-5'>軟件包</b>的<b class='flag-5'>方法</b>

    RT-Thread使用cjson軟件包發(fā)送64位長(zhǎng)整型數(shù)據(jù)

    開(kāi)發(fā)環(huán)境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的資源為0.2.2,rt-thread版本為4.1.1,cjson軟件包使
    的頭像 發(fā)表于 10-11 15:09 ?1093次閱讀
    <b class='flag-5'>RT-Thread</b>使用cjson<b class='flag-5'>軟件包</b>發(fā)送64位長(zhǎng)整型數(shù)據(jù)

    RT-ThreadLan8720和lwip協(xié)議棧的使用

    開(kāi)發(fā)環(huán)境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的資源為0.2.2,Agile Modbus
    的頭像 發(fā)表于 10-13 10:19 ?1827次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>中</b>Lan8720和lwip協(xié)議棧的使用

    RT-Threadmymqtt軟件包使用方法

    在上一篇文章 RT-ThreadLan8720和lwip協(xié)議棧的使用的工程基礎(chǔ)上添加mymqtt軟件包。 使能mqtt example和mqtt test,保存,等待下載更新軟件包
    的頭像 發(fā)表于 10-13 10:44 ?1152次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>中</b>mymqtt<b class='flag-5'>軟件包</b>的<b class='flag-5'>使用方法</b>