Agile Modbus STM32裸机移植 从机使用

embedded/2024/9/25 15:28:14/

本教程手把手教你实现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.ppmy.cn/embedded/113648.html

相关文章

深度学习的笔记

1. 从huggingface上仅下载pytorch模型权重和配置文件到服务器 import os import shutil from huggingface_hub import snapshot_download# 直接指定模型和下载路径 model_name openai/clip-vit-base-patch32 download_path /home/xxx/.cache/huggingface/hub/models--anas-a…

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

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

1. 如何在Java中连接MySQL数据库?请解释使用JDBC连接的步骤。

要在Java中连接MySQL数据库,通常使用JDBC(Java Database Connectivity)API。这是一个用于执行SQL语句的Java API,可以用来访问关系型数据库。下面是使用JDBC连接MySQL数据库的详细步骤: 1. 添加MySQL JDBC驱动 首先&a…

每日新闻掌握【2024年9月12日 星期四】

2024年9月12日 星期四 农历八月初十 大公司/大事件 iPhone 16 Pro Max机型或占总销量35% 市场研究机构TechInsights发布报告,预计iPhone 16系列的出货量将超过其前代产品,2024年全球出货量预计将达到7300万台。此外iPhone 16 Pro Max预计将成为iPhone …

如何用python做一个计算器

很久不更新了,今天来更新一下,初学python,若有可以完善部分可以私信,谢谢大家的支持,代码如下: print("欢迎使用计算器")aint(input("请输入第一个数字\n")) bint(input("请输入第…

小程序面试题四

一、如何提高微信小程序的应用速度? 提高微信小程序的应用速度,可以从多个方面进行优化。以下是一些关键的方法和建议: 1. 优化网络请求 减少请求次数:尽可能合并多个请求,减少HTTP请求的次数。这可以通过批量处理数…

【OJ刷题】双指针问题3

这里是阿川的博客,祝您变得更强 ✨ 个人主页:在线OJ的阿川 💖文章专栏:OJ刷题入门到进阶 🌏代码仓库: 写在开头 现在您看到的是我的结论或想法,但在这背后凝结了大量的思考、经验和讨论 目录 1…

秒懂C++之特殊类设计

目录 设计一个类,不能被拷贝 设计一个类,只能在堆上创建对象 设计一个类,只能在栈上创建对象 设计一个类,无法被继承 设计一个类,只能创建一个对象(单例模式) 饿汉模式 懒汉模式 设计一个类,不能被拷…