STM32开发中循环队列的使用

目录

STM32开发中循环队列的使用

串口通讯配合循环队列使用的大概流程

循环队列queue.h文件

循环队列queue.c文件


STM32开发中循环队列的使用

在进行stm32开发时,往往会需要进行板卡间的通讯,而这时我们通常会使用到串口通讯的功能。使用串口通讯搭配循环队列就可以完成板卡间按照制定的通讯协议进行通讯的流程,从而完成各种需要的功能。以下简要介绍下循环队列的使用及参考代码。

串口通讯配合循环队列使用的大概流程

假设我们有主驱动板和从驱动板两块硬件板卡。需要完成的操作是通过主驱动板按照制定的通讯协议发送指令控制从驱动板上连接的设备完成相关的操作。我们可以通过串口通讯配合循环队列来完成。1、主驱动板使用串口发送指令给从驱动板2、从驱动板接收到串口指令后保存到循环队列中3、在从驱动板主程序中进行逐条进行解析指令并控制硬件设备完成相关的操作4、完成操作后应答主驱动板
为了结构的清晰这里将循环队列的实现代码分为queue.h和queue,c两部分。

循环队列queue.h文件

#ifndef __QUEUE_H
#define __QUEUE_H
​
#ifndef u8
typedef unsigned char u8;
#endif
​
#ifndef s8
typedef unsigned char s8;
#endif
​
#ifndef u16
typedef unsigned short u16;
#endif
​
#ifndef int16
typedef unsigned short int16;
#endif
​
#ifndef u32
typedef unsigned int u32;
#endif
​
#ifndef int32
typedef unsigned int int32;
#endif
​
#define QUEUE_DATA_TYPE u8
//定义循环队列的操作结果
#define QUEUE_INVALID   -1  //循环队列无效
#define QUEUE_OK    0
#define QUEUE_FULL  2
#define QUEUE_EMPTY 3
​
//定义循环队列数据结构
typedef struct 
{QUEUE_DATA_TYPE *Start; //队列的起始地址QUEUE_DATA_TYPE *End;   //队列的结束地址u16 MaxData;            //列中允许存储的数据个数u16 ReadLen;            //读出的数据长度u16 WriteLen;           //写入的数据长度u8 (* ReadEmpty)();     //队列读空处理函数u8 (* WriteFull)();     //队列写满处理函数QUEUE_DATA_TYPE Buf[1]; //队列头部存储的数据
}DataQueue;
​
//函数接口声明
//1、创建循环队列
s8 Queue_Create(void *Buf, u32 Size,u8 (*ReadEmpty)(),u8 (*WriteFull)());
​
//2、从队列中读出一个数据
s8 Queue_Read(QUEUE_DATA_TYPE *Ret, void *Buf);
​
//3、向队列中写入一个数据
s8 Queue_Write(void *Buf,QUEUE_DATA_TYPE data);
​
//4、获取队列中剩余的数据个数
int16 Queue_Get_Reamin_Count(void *Buf);
​
//5、获取队列最大存储个数
int16 Queue_Get_Max_Count(void *Buf);
​
//6、清空队列
s8 QueueFlush(void *Buf);
​
//7、队列写满处理函数
s8 QueueWriteFull(DataQueue *Buf,QUEUE_DATA_TYPE data);
​
//8、向队列中写入多个数据
s8 QueueWriteNData(void *Buf,QUEUE_DATA_TYPE *data,u32 cnt);
​
#endif

循环队列queue.c文件

#include "queue.h"
​
/*
函数功能:创建循环队列
参数说明:Buf:        队列的存储空间地址Size:       存储空间大小ReadEmpty:  队列读空处理函数WriteFull: 队列写满处理函数
返回值:QUEUE_OK:成功QUEUE_INVALID:队列无效
*/
s8 Queue_Create(void *Buf, u32 Size,u8 (*ReadEmpty)(),u8 (*WriteFull)())
{DataQueue *Queue;//判断队列的有效性if(Buf != NULL && Size >= sizeof(DataQueue)){Queue = (DataQueue *)Buf;//初始化队列Queue->MaxData = (Size - ((u32)&Queue->Buf[0] - (u32)&Queue->Start)) /   sizeof(QUEUE_DATA_TYPE);Queue->End = Queue->Buf + Queue->MaxData;Queue->Start = Queue->Buf;Queue->ReadLen = 0;Queue->WriteLen = 0;Queue->ReadEmpty = ReadEmpty;Queue->WriteFull = WriteFull;return QUEUE_OK;}else{return QUEUE_INVALID;}
}
​
/*
函数功能:从队列中读出一个数据
参数说明:Ret: 读出一个数据的存储地址Buf: 队列的存储空间地址
返回值:QUEUE_OK:成功QUEUE_EMPTY:队列为空QUEUE_INVALID:队列无效
*/
s8 Queue_Read(QUEUE_DATA_TYPE *Ret, void *Buf)
{s8 err;DataQueue *Queue;       err = QUEUE_INVALID;if(Buf != NULL){Queue = (DataQueue *)Buf;if(Queue->ReadLen != Queue->WriteLen){*Ret = *(Queue->Buf + Queue->ReadLen);Queue->ReadLen++;if(Queue->ReadLen >= Queue->MaxData){Queue->ReadLen = 0;}err = QUEUE_OK;}else{err = QUEUE_EMPTY;}}return err;
}
​
​
/*
函数功能:向队列中写入一个数据
参数说明:Buf: 队列的存储空间地址data:待写入的数据
返回值:QUEUE_OK:成功QUEUE_INVALID:队列无效
*/
s8 Queue_Write(void *Buf,QUEUE_DATA_TYPE data)
{s8 err;DataQueue *Queue;err = QUEUE_INVALID;if(buf != NULL){Queue = (DataQueue *)Buf;*(Queue->Buf + Queue->WriteLen) = data;Queue->WriteLen++;if(Queue->WriteLen >= Queue->MaxData){Queue->WriteLen = 0;}err = QUEUE_OK;}       return err;
}
​
​
/*
函数功能:获取队列中剩余的数据个数
参数说明:Buf: 队列的存储空间地址
返回值:QUEUE_INVALID:队列无效count:剩余数据个数
*/
int16 Queue_Get_Reamin_Count(void *Buf)
{u16 count;DataQueue *Queue;Queue = (DataQueue *)Buf;if(Buf != NULL){if(Queue->WriteLen >= Queue->ReadLen){ count = Queue->WriteLen - Queue->ReadLen;}else{count = Queue->MaxData - (Queue->ReadLen - Queue->WriteLen);
​}return count;}return QUEUE_INVALID;
}
​
​
/*
函数功能:获取队列最大存储个数
参数说明:Buf: 队列的存储空间地址
返回值:max:剩余数据个数QUEUE_INVALID:队列无效
*/
int16 Queue_Get_Max_Count(void *Buf)
{int16 max = QUEUE_INVALID;if(Buf != NULL){max = ((DataQueue *)Buf)->MaxData;}return max;
}
​
​
/*
函数功能:清空队列
参数说明:Buf: 队列的存储空间地址
返回值:QUEUE_OK:成功QUEUE_INVALID:队列无效
*/
s8 QueueFlush(void *Buf)
{DataQueue *Queue;s8 err = QUEUE_INVALID;if(Buf != NULL){Queue = (DataQueue *)Buf;Queue->Start = Queue->Buf;Queue->WriteLen = 0;Queue->ReadLen = 0;err = QUEUE_OK;}return err;
}
​
​
/*
函数功能:队列写满处理函数
参数说明:Buf: 队列的存储空间地址data:待写入的数据
返回值:QUEUE_OK:成功QUEUE_INVALID:队列无效
*/
s8 QueueWriteFull(DataQueue *Buf,QUEUE_DATA_TYPE data)
{return QueueWrite((void *)Buf,data);
}
​
​
/*
函数功能:向队列中写入多个数据
参数说明:Buf: 队列的存储空间地址data:待写入的数据起始地址cnt:写入数据的个数
返回值:QUEUE_OK:成功QUEUE_INVALID:队列无效
*/
s8 QueueWriteNData(void *Buf,QUEUE_DATA_TYPE *data,u32 cnt)
{s8 err;u32 i;DataQueue *Queue;err = QUEUE_INVALID;if(Buf != NULL){ Queue = (DataQueue *)Buf;Queue->MaxData = (sizeof(Buf)- ((u32)&Queue->Buf[0] - (u32)&Queue->Start))/sizeof(QUEUE_DATA_TYPE);for(i=0; i<cnt; i++){*(Queue->Buf + Queue->WriteLen) = *(data + i);Queue->WriteLen++;if(Queue->WriteLen >= Queue->MaxData){Queue->WriteLen = 0;}}err = QUEUE_OK;}return err;
}

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

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

相关文章

AI智剪新风尚:一键操作,批量视频剪辑轻松入门

随着科技的飞速进步&#xff0c;人工智能(AI)已逐渐渗透到我们生活的各个领域&#xff0c;其中&#xff0c;AI视频剪辑技术的出现&#xff0c;为视频制作带来了革命性的变革。如今&#xff0c;一键操作、批量处理的AI智剪正成为视频剪辑的新风尚&#xff0c;让剪辑工作变得前所…

Mysql进阶-索引篇

Mysql进阶 存储引擎前言特点对比 索引介绍常见的索引结构索引分类索引语法sql分析索引使用原则索引失效的几种情况sql提示覆盖索引前缀索引索引设计原则 存储引擎 前言 Mysql的体系结构&#xff1a; 连接层 最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接…

持续总结中!2024年面试必问 100 道 Java基础面试题(三十七)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 100 道 Java基础面试题&#xff08;三十六&#xff09;-CSDN博客 七十三、什么是hash冲突&#xff1f; 在计算机科学中&#xff0c;特别是在数据结构和算法领域&#xff0c;哈希冲突&#xff08;Hash Collision&…

HI3516CV610

一、总体介绍 HI3516CV610是一颗应用在安防市场的IPC SoC&#xff0c;在开放操作系统、新一代视频编解码标准网络安全和隐私保护、人工智能方面引领行业发展&#xff0c;主要面向室内外场景下的枪机、球机、半球机、海螺机、枪球一体机、双目长短焦机等产品形态&#xff0c;打…

访问网络附加存储:nfs

文章目录 访问网络附加存储一、网络附加存储1.1、存储类型1.3、通过NFS挂载NAS1.4、NFS挂载过程服务端客户端 二、实验&#xff1a;搭建NFS服务端及挂载到nfs客户端服务端客户端测试命令合集服务端客户端 访问网络附加存储 一、网络附加存储 1.1、存储类型 DAS&#xff1a;Di…

学习Uni-app开发小程序Day6

今天是学习的第六天&#xff0c;把以前的重新回顾一次&#xff0c;加深记忆 v-for列表循环和复选框展示 这是vue的学习知识&#xff0c;在组件中使用后v-for&#xff0c;方式有几种&#xff0c; v-for“item in 数据源” v-for“&#xff08;item &#xff0c; index&#xff0…

零代码编程:用Kimichat从PDF文件中批量提取图片

一个PDF文件中&#xff0c;有很多图片&#xff0c;想批量提取出来&#xff0c;可以借助kimi智能助手。 在借助kimi智能助手中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个网页爬取Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹…

2024年融资融券利率最新变化,又降低了?

最近有很多朋友在问我问融资融券的业务&#xff0c;都是比较关心这个利率的问题。确实&#xff0c;做融资融券最重要的利率&#xff0c;利率低会节省很大一笔资金&#xff0c;今天在这边给大家对接一个上市券商&#xff0c;可以给到大家万一的交易佣金和5%的融资利率&#xff0…

行业早报5.9

1.LG Display 一季度营收 5.253 万亿韩元&#xff0c;同比增长 19%&#xff1b; 2.郭明錤预测英伟达 2025 年第 4 季度量产新一代 R 系列 AI 芯片&#xff1b; 3.小鹏汽车 4 月交付量 9393 辆&#xff1a;同比增长 33%&#xff1b; 4.中国儒意 2.59 亿元收购有爱互娱&#xff0…

乡村振兴规划设计一站式资料大全,能为乡村振兴从业者带来什么帮助?

乡村振兴规划设计一站式资料大全对于乡村振兴从业者来说&#xff0c;具有非常重要的帮助作用。这种资料大全通常包含了从政策解读、市场分析、规划设计、到实施策略等各个方面的详尽信息&#xff0c;能够极大地提升从业者的工作效率和专业能力。 具体来说&#xff0c;乡村振兴规…

Python selenium

1.搭建环境 1.安装&#xff1a; pip install msedge-selenium-tools 不要使用pip install selenium&#xff0c;我的电脑上没法运行 2.下载驱动 Microsoft Edge WebDriver |Microsoft Edge 开发人员 edge浏览器点设置---关于即可找到版本号&#xff0c;一定要下载对应版…

【TypeScript类型兼容性简介以及使用方法】

TypeScript 的类型兼容性是指当一个类型被赋值给另一个类型时&#xff0c;是否满足赋值操作的条件。TypeScript 通过其结构化类型系统来进行类型兼容性的判断&#xff0c;即只要两个类型的结构相似&#xff0c;它们就是兼容的。 在判断两个类型是否兼容时&#xff0c;TypeScri…

实践精益理念:精益生产培训助力企业持续增长

在日益激烈的市场竞争中&#xff0c;企业如何寻找持续增长的动力&#xff0c;提升整体创新能力和核心竞争力&#xff1f;张驰咨询通过多年来的深入研究和实践&#xff0c;结合众多企业的实际情况&#xff0c;带来了精益生产培训的全新视角。 在近期举办的一次精益生产培训中&am…

五种算法(BWO、RUN、SO、HO、GWO)求解复杂城市地形下无人机路径规划,可以修改障碍物及起始点(MATLAB)

一、算法介绍 &#xff08;1&#xff09;白鲸优化算法BWO 参考文献&#xff1a;Zhong C, Li G, Meng Z. Beluga whale optimization: A novel nature-inspired metaheuristic algorithm[J]. Knowledge-Based Systems, 2022, 109215. &#xff08;2&#xff09;龙格-库塔优化…

服务器数据恢复—RAID5磁盘阵列两块盘离线的数据恢复过程

服务器故障&#xff1a; 服务器中有一组由多块硬盘组建的raid5磁盘阵列&#xff0c;服务器阵列中2块硬盘先后掉线导致服务器崩溃。 服务器数据恢复过程&#xff1a; 1、将故障服务器中所有磁盘编号后取出&#xff0c;由硬件工程师对掉线的两块磁盘进行物理故障检测&#xff0c…

Hoot100-T6三数之和

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例 1…

二层交换机与路由器连通上网实验

华为二层交换机与路由器连通上网实验 二层交换机是一种网络设备&#xff0c;用于在局域网&#xff08;LAN&#xff09;中转发数据帧。它工作在OSI模型的第二层&#xff0c;即数据链路层。二层交换机通过学习和维护MAC地址表&#xff0c;实现了数据的快速转发和广播域的隔离。 实…

java数据结构之数组系统了解

1.数组介绍 数组就是一个存储数据的容器&#xff0c;容器的长度固定、存储元素的数据类型固定。 跟变量加以区分&#xff1a;变量也可以存储数据&#xff0c;但是只能存一个值。当要存的数据比较多的时候&#xff0c;用变量就不方便了。我们就可以使用数组来存储。 1.1数组…

并发编程实现

一、并行编程 1、Parallel 类 Parallel类是System.Threading.Tasks命名空间中的一个重要类&#xff0c;它提供数据并行和任务并行的高级抽象。 For和ForEach Parallel类下的For和ForEach对应着普通的循环和遍历(普通的for和foreach)&#xff0c;但执行时会尝试在多个线程上…

搜维尔科技:工作场所人体工程学分析-最大限度地提高员工生产力

工作场所人体工程学分析-最大限度地提高员工生产力 - 增强工作场所安全和生产力&#xff1a;了解人体工程学评估在改善工作场所安全和提高企业生产力方面的关键作用 搜维尔科技&#xff1a;工作场所人体工程学分析-最大限度地提高员工生产力