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

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

3天内不再提示

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

冬至子 来源:YZRD 作者:YZRD 2023-10-11 15:37 3442次阅读

开发环境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的资源包为0.2.2,Agile Modbus软件包版本为v1.1.2。工程使用上一篇 RT-Thread中RS485驱动包的使用 工程为基础。

单片机作为主站Master,从站使用软件Modbus Slave模拟

打开工程,添加软件包Agile Modbus,添加成功,先进行编译,查看是否有错误。编译正常。

根据Agile Modbus软件包的文档介绍,

  • 主机:
  • 1.agile_modbus_rtu_init / agile_modbus_tcp_init 初始化 RTU/TCP 环境
  • 2.agile_modbus_set_slave 设置从机地址
  • 3.清空接收缓存
  • 4.agile_modbus_serialize_xxx 打包请求数据
  • 5.发送数据
  • 6.等待数据接收结束
  • 7.agile_modbus_deserialize_xxx 解析响应数据
  • 8.用户处理得到的数据

参考代码为

#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");
}
}

因为我们使用的是rs485驱动包,根据例程,我们知道需要增加几个函数,如下:

static int Bsp_Rs485_init(void); //Rs485初始化+设置超时时间
static int Bsp_Rs485_Tx(uint8_t *buf,int size); //Rs485 发送
static int Bsp_Rs485_Rx(uint8_t *buf,int size); //Rs485接受

根据例程,修改主函数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");
}
}

编译正常,下载到开发板。

打开模拟软件Modbus Slave,设置基本参数。Modbus Slave的使用参考:参考
可以看到输出端口打印出了从站数据的信息。

1.jpg

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

    关注

    54

    文章

    8429

    浏览量

    148000
  • ModBus协议
    +关注

    关注

    3

    文章

    179

    浏览量

    33816
  • RS485接口
    +关注

    关注

    2

    文章

    62

    浏览量

    14362
  • STM32F407
    +关注

    关注

    15

    文章

    188

    浏览量

    29905
  • RT-Thread
    +关注

    关注

    31

    文章

    1329

    浏览量

    41066
收藏 人收藏

    相关推荐

    RT-Thread记录(十八、SHT21与24C02软件包

    本文学习测试一下几款典型设备的 RT-Thread I2C软件包
    的头像 发表于 07-08 11:07 3827次阅读
    <b class='flag-5'>RT-Thread</b>记录(十八、SHT21与24C02<b class='flag-5'>软件包</b>)

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

    最近在学习 RT-Thread 的 NimBLE 软件包,使用 menuconfig 配置选中 NimBLE 软件包,设置各种选项后,成功通过编译并且运行起来。不过这仅仅只是按照文档
    发表于 06-27 11:18

    基于RT-Thread实现的Agile Modbus协议栈

    mcu_demos  在 AT32F437 上基于 RT-Thread 实现的支持 Modbus 固件升级的 Bootloader:AT32F437_Boot  在 HPM6750 上
    发表于 10-08 15:04

    RT-ThreadAgile Modbus软件包的使用

    开发环境:野火的stm32f407,rt-thread studio版本为版本: 2.2.6,stm32f4的资源为0.2.2,Agile Modbus
    发表于 02-10 16:46

    RT-Thread的mymqtt软件包添加步骤与使用方法

    文章 RT-ThreadLan8720和lwip协议栈的使用的工程基础上添加mymqtt软件包。使能mqtt example和mqtt test,保存,等待下载更新软件包。编译,本以
    发表于 02-13 14:58

    RT-Thread Studio安装软件包agile-modbus后编译出现arm-none-eabi-gcc: fatal错误

    软件包,选择agile_modbus,保存setting,自动下载库文件 3,点击“重新构建项目”,出现如下错误: linking… arm-none-eabi-gcc: fatal error
    发表于 09-08 15:34

    RT-Thread 软件包介绍

    RT-Thread 软件包介绍软件包的目的软件包在高级语言中非常常见,很多高级语言都有对应的软件包平台,比如 Python 的 PyPi,R
    发表于 05-21 19:38 5618次阅读

    RT-Thread软件包定义和使用

    RT-Thread软件包是运行于RT-Thread物联网操作系统平台上,面向不同应用领域的通用软件组件 。RT-Thread 同时提供了开放
    的头像 发表于 05-21 11:29 1.1w次阅读
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>软件包</b>定义和使用

    RT-Thread社区上有哪些优秀的软件包

    SX12XX 软件包是基于 semtech 官网 Firmware Drivers V2.1.0代码库的移植实现,目前只支持 SX1278 LoRa设备。该软件包在原代码库功能的基础上,对接 RT-Thread SPI 设备驱动
    的头像 发表于 04-03 15:35 7818次阅读

    2022 RT-Thread全球技术大会:RT-Thread软件包

    RT-Thread在2022年上半年新增几十个软件包:rtt-rust、LuatOS、gui-guider-demo。
    的头像 发表于 05-27 14:12 1146次阅读
    2022 <b class='flag-5'>RT-Thread</b>全球技术大会:<b class='flag-5'>RT-Thread</b><b class='flag-5'>软件包</b>

    RT-Thread全球技术大会:恩智浦新增100+软件包

    RT-Thread全球技术大会:恩智浦新增100+软件包,支持了很多有用的功能。             审核编辑:彭静
    的头像 发表于 05-27 14:26 1049次阅读
    <b class='flag-5'>RT-Thread</b>全球技术大会:恩智浦新增100+<b class='flag-5'>软件包</b>

    RT-Thread在线软件包改为本地软件包方法

    RT-Thread软件包,使用时需要手动通过 ENV 工具 更新到 本地的 packages 目录,并且 packages 目录默认不参与 Git 工程管理,软件包多了,偶尔需要更改软件包
    的头像 发表于 08-11 15:02 1448次阅读
    <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软件包发送64位长整型数据

    开发环境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的资源为0.2.2,rt-thread版本为4.1.1,cjson软件包使
    的头像 发表于 10-11 15:09 1118次阅读
    <b class='flag-5'>RT-Thread</b>使用cjson<b class='flag-5'>软件包</b>发送64位长整型数据

    RT-ThreadLan8720和lwip协议栈的使用

    开发环境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的资源为0.2.2,Agile Modbus
    的头像 发表于 10-13 10:19 1908次阅读
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>中</b>Lan8720和lwip协议栈的使用

    RT-Threadmymqtt软件包使用方法

    在上一篇文章 RT-ThreadLan8720和lwip协议栈的使用的工程基础上添加mymqtt软件包。 使能mqtt example和mqtt test,保存,等待下载更新软件包
    的头像 发表于 10-13 10:44 1176次阅读
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>中</b>mymqtt<b class='flag-5'>软件包</b>的<b class='flag-5'>使用方法</b>