Agile Modbus STM32裸机移植 从机使用

news2024/9/20 6:25:04

本教程手把手教你实现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.coloradmin.cn/o/2145177.html

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

相关文章

安科瑞AIM-D100系列 光伏直流系统直流绝缘监测仪——保障光伏发电运行稳定可靠

应用场景:发电厂家、变电站的直流屏、电动汽车充电装置、UPS供电系统、光伏直流系统、储能系统及其它直流电网等直流系统。 随着工业的发展,很多用电设备和工厂设备采用直流系统供电,直流系统的正极和负极不接地。对于不接地(IT&…

Axure中后台管理信息系统通用原型方案

Axure中后台管理信息系统通用原型方案中的12套模板,旨在帮助开发者与设计师快速搭建出标准且美观的中后台产品原型,提升开发效率和节省协作成本。这些模板覆盖了多样化的中后台管理系统开发需求,具有高度的灵活性和可定制性。 以下是对这些模…

LINUX网络编程:传输层

目录 1.端口号 1.1知名端口号 1.2注意 2.UDP协议 2.1UDP报头的格式 2.2UDP的特点 2.3UDP的缓冲区 1.端口号 端口号的作用标识一个网络中主机的一个进程。 网络之间通信无非就是,发送端和接受端进程之间的通信,所以通过ip地址找到目标主机之后&am…

城市道路街景的绿视率计算 绿化率计算(包括街景的获取)

项目背景 随着城市化进程的加快,城市绿地的重要性日益凸显。合理的绿化不仅能美化城市环境,还能净化空气、调节气候、减轻热岛效应等。因此,对城市道路街景的绿视率和绿化率进行量化分析,对于促进城市可持续发展具有重要意义。 项…

基于stm32的四旋翼无人机控制系统设计系统设计与实现

文章目录 前言资料获取设计介绍功能介绍设计程序 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业…

基于SpringBoot+Vue+MySQL的家乡特色推荐系统

系统展示 用户前台界面 管理员后台界面 系统背景 在当今数字化时代,随着旅游业的蓬勃发展和人们对本土文化探索的热情日益增长,一个基于SpringBoot、Vue.js与MySQL的家乡特色推荐系统应运而生。该系统旨在通过现代互联网技术,深度挖掘并展示各…

六、RS485实验

目录 一、RS485介绍 二、RS485通信电路 1、TP8485接口 2、485通信波形图 三、RS485相关HAL库驱动介绍 一、RS485介绍 串口是一个泛称,UART、RS232、RS422和RS485都遵循类似的通信时序协议,被通称为串口。 图1 通信时序协议 RS485是串行通信标准&am…

DBeaver 连接 mysql 报错:Public Key Retrieval is not allowed

前言 DBeaver 连接 mysql 报错:Public Key Retrieval is not allowed 遇到 "Public Key Retrieval is not allowed" 错误时,通常意味着你正在使用的身份验证方法需要加密连接,但是没有正确地配置客户端或服务器来支持这种加密。 解…

springbootadmin源码编译修改001_node版本管理工具nvm_任意切换node版本_没有成功记录过程---VUE工作笔记0026

由于项目需要对springbootadmin的源码进行编译和修改. 但是springbootadmin的源码编译很麻烦,主要是由于,springbootadmin-server-ui这个项目,因为他是一个前后端分离的 vue项目,而且是使用 https://github.com/coreybutler/nvm-windows/releases/tag/1.1.12 首先去下载,发…

Give azure openai an encyclopedia of information

题意:给 Azure OpenAI 提供一部百科全书式的信息 问题背景: I am currently dabbling in the Azure OpenAI service. I want to take the default model and knowledge base and now add on to it my own unique information. So, for example, for mak…

设备稳定流畅视频体验,乐鑫ESP32-S3芯片方案无线音视频传输通信

在快节奏的现代生活中,家庭安全和便利性成为了人们日益关注的话题。随着物联网技术的发展,智能家居安全系统正逐渐成为守护家庭的新选择。 家居安全如门锁和警报器,这些产品通过先进的传感器、摄像头和智能分析技术,不仅能够实时…

媒体购买指南:是什么以及如何开始

媒体购买是几乎任何企业都非常重要的一个过程,其中包括付费的网络广告、电视广告、音频广告、户外广告等,这些都是许多多渠道营销策略中的重要组成部分。然而,线上和线下广告远非简单之事,尤其是数字广告,随着各种平台…

Hadoop生态圈拓展内容(一)

1. Hadoop的主要部分及其作用 HDFS(Hadoop分布式文件系统) HDFS是一个高容错、高可靠性、高可扩展性、高吞吐率的分布式文件存储系统,负责海量数据的存储。 YARN(资源管理调度系统) YARN是Hadoop的资源管理调度系统…

【Linux】权限理解(超详细)

目录 用户 角色切换 创建和删除普通用户 权限管理 文件访问者分类(人) 文件类型和访问权限(事物属性)​编辑 文件访问权限的相关设置方法 chmod chown chgrp 问题解答 粘滞位 用户 Linux下有两种用户:超级…

什么是期权日内交易?怎么做日内期权策略?

今天带你了解什么是期权日内交易?怎么做日内期权策略?期权日内交易是一种高频、快速的交易方式,适合能够快速反应并进行市场分析的交易者。 50ETF期权日交易额 50ETF期权日交易额也就是常说的50ETF期权成交量,大多数投资者们都听过交易要买…

程序员修炼之道 11:当你编码时

不记录,等于没读。 这里是我阅读《程序员修炼之道》这本书的记录和思考。 编码阶段不是机械性工作,而是每一分钟都要做出决定——深思熟虑后的决定。如果把编码阶段当成机械性工作,认为这个阶段只是把设计翻译成可运行的代码段,这…

初识 performance_schema:轻松掌握MySQL性能监控

什么是 performance_schema performance_schema 是 MySQL 5.8 版本的一个强大功能,它就像是一个内置的**“性能侦探”**,专门用来监控和分析 MySQL 服务器的资源消耗和等待情况。有了它,数据库管理员和开发者就能实时了解服务器的运行状态&a…

【LLM】中国在 GPT/LLM 大模型上是否已经实现了弯道超车?

还是谈一下现状吧。中国的大模型公司与美国的大模型公司其实在数量上可能中国更多一些吧。 美国的 OpenAI:No.1,毫无疑问!Google:尽管落了,但是依然是全球第二的实力吧?Meta:开源全靠它家的Ll…

字幕编辑用什么软件好?盘点国内外7款视频加字幕软件,简单高效!

视频添加字幕被认为是让观众更好理解您在视频中讲述内容的最佳和最常见的方式。例如,您可以给视频中的某些文字添加不同的颜色,以帮助观众识别视频中的角色。然而,在制作视频过程中,添加字幕往往是个耗时耗力的任务。因此&#xf…

rsync 服务详解

目录 1.前言 2. rsync 常用选项 3.rsync应用场景 4.rsync使用模式 5.rsync推与拉​编辑 5.1rsync推送 ​编辑5.2rsync拉取 6.rsync本地模式 7.远程模式 8.rsync守护进程 8.2改配置文件 8.3添加虚拟用户 8.4创建密码文件 8.5给文件给予权…