Agile Modbus STM32裸机移植 从机使用

本教程手把手教你实现Agile Modbus,照抄就能成。

并且会解读函数功能含义。

1. 引言

Agile Modbus 是一个轻量级的 Modbus 协议栈,可以满足用户在任何场景下的需求。

功能

  1. 支持 rtu 和 tcp 协议,使用纯 C 语言开发,不涉及任何硬件接口,可以直接在任何形式的硬件上使用。
  2. 由于它是使用纯 C 语言开发的,不涉及硬件,因此可以在串口上运行 tcp 协议,在网络上运行 rtu 协议。
  3. 支持符合 Modbus 格式的自定义协议。
  4. 支持多个 master 和多个 slave 同时。
  5. 它很容易使用。您只需初始化 rtu 或 tcp 句柄,并调用相应的 API 进行打包和解包即可。

在使用Agile Modbus时我们可以查看Agile Modbus帮助文档进行使用。

  • 在线文档:API 手册

2.移植

        根据帮助手册的指示进行移植Agile_modbus。

2.1 文件移植

官方资源:

 讲文件移植至工程内。在本实验中只用到了agile_modbus.c、agile_modbus.h文件。

2.2 代码移植

步骤

  1. 初始化RTU/TCP环境 ( agile_modbus_rtu_init / agile_modbus_tcp_init )
  2. 设置从地址 ( agile_modbus_set_slave )
  3. 等待数据接收结束
  4. 处理请求数据 ( agile_modbus_slave_handle )
  5. 发送数据
  6. 清除接收缓存区(可选)
  7. 实现 agile_modbus_slave_callback_t 类型回调函数--若无实现,则只有数据回传功能

定义

#define AGILE_MODBUS_MAX_ADU_LENGTH 260
uint8_t ctx_send_buf[AGILE_MODBUS_MAX_ADU_LENGTH];
uint8_t ctx_read_buf[AGILE_MODBUS_MAX_ADU_LENGTH];
agile_modbus_rtu_t ctx_rtu;
agile_modbus_t *ctx = &ctx_rtu._ctx;

初始化RTU和设置设备地址(只需执行一次)

/* 一、RTU 初始化 */
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);

 循环处理数据

/* 循环执行 *//* 三、接收字符串并通过字符串长度判断是否接收到字符串 */
if(rs485_receive_data())
{   /* rs485_rx_buf--串口接收缓存区 *//* 四、传入参数 */ctx->read_buf = rs485_rx_buf;/* 五、从机数据处理 -- 将数据进行解析校验,用户通过回调函数编写自定义功能 */int send_len = agile_modbus_slave_handle(ctx, rs485_rx_cnt, 1, agile_modbus_slave_cb, NULL, NULL);/* 六、判断数据处理是否成功 */if (send_len > 0){/* 七、串口发送Modbus数据 -- ctx->send_buf为已经处理好的Modbus数据 */rs485_send_data(ctx->send_buf, send_len);}/* 八、清除串口接收缓存区 */   rs485_receive_flush();
}

编写回调函数

/* slave handle callback */
static int agile_modbus_slave_cb(agile_modbus_t                 *ctx,struct agile_modbus_slave_info *slave_info,const void                     *data)
{int function = slave_info->sft->function;int ret      = -AGILE_MODBUS_EXCEPTION_ILLEGAL_FUNCTION;/* 功能码 */switch (function){    /* 0x03 */case AGILE_MODBUS_FC_READ_HOLDING_REGISTERS:break;/* 0x06 */case AGILE_MODBUS_FC_WRITE_SINGLE_REGISTER:break;/* 0x010 */case AGILE_MODBUS_FC_WRITE_MULTIPLE_REGISTERS:break;}return ret;
}

3. 代码使用

        需只要在回调函数中,根据功能码对应位置编写所需功能代码即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1538349.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

《微处理器系统原理与应用设计第十三讲》通用同/异步收发器USART轮询模式应用设计

USART提供两设备之间的串行双工通信,并支持中断和DMA工作。采用轮询、中断和DMA三种方式进行数据收发。 一、功能需求 实现远程串行通信数据的回传确认。微处理器系统构成的测控设备通过USART(串口)与用户设备(上位机&#xff0…

OpenHarmony(鸿蒙南向开发)——标准系统方案之扬帆移植案例

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ OpenHarmony(鸿蒙南向开发)——轻量系统STM32F407芯片移植案…

Java中的事务管理

1.1 事务管理 1.1 事务回顾 事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体,一起向数据库提交或者是撤销操作请求。所以这组操作要么同时成功,要么同时失败。 怎么样来控制这组操作,让这组操…

C++list的使用:尾插、头插、insert、erase、reverse、sort等的介绍

文章目录 前言一、尾插、头插、insert、erase二、reverse、sort总结 前言 Clist的使用&#xff1a;尾插、头插、insert、erase、reverse、sort等的介绍 一、尾插、头插、insert、erase #include <iostream> #include <list>using namespace std;void test_list1(…

【算法】BFS系列之 FloodFill 算法

【ps】本篇有 4 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1&#xff09;图像渲染 .1- 题目解析 .2- 代码编写 2&#xff09;岛屿数量 .1- 题目解析 .2- 代码编写 3&#xff09;岛屿的最大面积 .1- 题目解析 .2- 代码编写 4&#xff09;被围绕的区域 .1- …

3DMAX动画渲染一百帧云渲染解决方案!

随着数字媒体快速发展&#xff0c;3D动画以其逼真的视觉效果和动态表现力&#xff0c;成为众多行业的首选。然而&#xff0c;高质量的3D动画渲染往往需要大量的计算资源。对于3DMAX动画渲染的一百帧&#xff0c;该如何的通过云渲染技术高效处理呢&#xff0c;我们一起来简单看看…

大中小企业应该如何选择PLM系统?PLM系统最新选型指南攻略

在当今竞争激烈的市场环境中&#xff0c;产品生命周期管理&#xff08;PLM&#xff09;系统已成为企业不可或缺的工具&#xff0c;它帮助企业有效地管理从产品设计到淘汰的整个生命周期。然而&#xff0c;不同规模的企业在选择PLM系统时面临着不同的挑战和需求。本文将分析小型…

云计算实训50——Kubernetes基础命令、常用指令

一、Kubernetes 自动补齐 # 安装自动补齐软件 [rootmaster ~]# yum -y install bash-completion # 临时开启自动补齐功能 [rootmaster ~]# source # 永 久开启自动补齐功能 [rootmaster ~]# echo "source > ~/.bashrc 二、Kubernetes 基础命令 kubectl [command] …

C++伟大发明--模版

C起初是不受外界关注的&#xff0c;别人觉得他和C语言没有本质上的区别&#xff0c;只是方便些&#xff0c;直到祖师爷发明了模版&#xff0c;开始和C语言有了根本的区别。 我们通过一个小小的例子来搞清楚什么是模版&#xff0c;模版的作用到底有多大&#xff0c;平时我们想要…

【Python报错已解决】 Requests.exceptions.ProxyError: HTTPSConnectionPool

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

上证50股指期权如何交易?

今天期权懂带你了解上证50股指期权如何交易&#xff1f;上证50期权的交易是一个涉及多个步骤和策略的过程。 上证期权 上证期权是指在上海证券交易所交易的期权合约&#xff0c;主要包括上证50ETF期权等。它是一种金融衍生品&#xff0c;给予持有者在特定日期以约定价格买入或…

【数据结构与算法 | 灵神题单 | 自底向上DFS篇】力扣508, 1026, 951

1. 力扣508&#xff1a;出现次数最多的子树元素和 1.1 题目&#xff1a; 给你一个二叉树的根结点 root &#xff0c;请返回出现次数最多的子树元素和。如果有多个元素出现的次数相同&#xff0c;返回所有出现次数最多的子树元素和&#xff08;不限顺序&#xff09;。 一个结…

【项目设计】Facial-Hunter

目录 一、项目介绍 二、开发环境以及技术 三、项目架构设计 3.1 项目总体架构 3.2 客户端架构 3.3 主服务端架构 3.4 处理服务端架构 3.5 数据库设计 四、FaceNet 五、代码实现 一、项目介绍 该项目是基于深度学习与负载均衡的人脸识别系统 该项目主要由三个部分组…

CytoTRACE2单细胞分化潜力预测工具学习

开发者在github中把关键点介绍的很清楚了。 1、根据细胞的分化潜能对细胞进行分类&#xff1a; totipotent(多谱系分化的全能)—pluripotent(多谱系分化的多能)—multipotent(谱系限制分化的多能)—oligopoten(谱系限制分化的寡能)—unipotent(谱系限制分化的单能)—differen…

裸土检测算法实际应用、裸土检测算法样本、裸土检测算法精准检测

裸土检测算法是一种前沿的图像识别技术&#xff0c;它通过利用先进的图像处理技术和机器学习算法&#xff0c;从卫星图像、无人机拍摄的图像或其他地面监测数据中提取出裸土区域&#xff0c;并对其进行精确的分类和分析。 与传统的地面勘察方法相比&#xff0c;裸土检测算法具有…

Redisson分布式锁分析,可重入、可续锁(看门狗)

前言 在此说明&#xff0c;本文章不只是讲一些抽象的概念&#xff0c;而是可落地的&#xff0c;在日常工作中基本上进行修改一下便可以使用。书接上回&#xff0c;上篇自研分布式锁的文章使用是一个自己手写的一个分布式锁&#xff0c;按照JUC里面java.util.concurrent.locks.L…

子查询优化

MySQL学习大纲 我的数据库学习大纲 1、什么是子查询&#xff1a; 1.MySQL 从 4.1 版本开始支持子查询&#xff0c;使用子查询可以进行 SELECT 语句的嵌套查询&#xff0c;即一个 SELECT 查询的结果作为另一个 SELECT 语句的条件。子查询可以一次性完成很多逻辑上需要多个步骤才…

渗透测试综合靶场 DC-2 通关详解

一、准备阶段 准备工具如Kali Linux&#xff0c;下载并设置DC-2靶场机。确保攻击机和靶机在同一网络段&#xff0c;通常设置为桥接模式或NAT模式。 1.1 靶机描述 Much like DC-1, DC-2 is another purposely built vulnerable lab for the purpose of gaining experience in …

社区志愿者服务系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;志愿者管理&#xff0c;社区管理&#xff0c;活动类型管理&#xff0c;志愿者活动管理&#xff0c;活动报名管理&#xff0c;活动签到管理&#xff0c;证书信息管理&#xff0c;系统管理 微信端账号功…

保护您的企业免受网络犯罪分子侵害的四个技巧

在这个日益数字化的时代&#xff0c;小型企业越来越容易受到网络犯罪的威胁。网络犯罪分子不断调整策略&#xff0c;并使用人工智能来推动攻击。随着技术的进步&#xff0c;您的敏感数据面临的风险也在增加。 风险的不断增大意味着&#xff0c;做好基本工作比以往任何时候都更…