环形缓冲区在stm32上的使用

目录

  • 环形缓冲区在stm32上的使用
    • 前言
    • 实验目的
    • 环形缓冲区的定义和初始化
    • 写入数据到环形缓冲区
    • 从环形缓冲区读取数据
    • 实验
    • 结果
    • 本文中的实践工程

环形缓冲区在stm32上的使用

本文目标:环形缓冲区在stm32上的使用

按照本文的描述,应该可以跑通实验并举一反三。

先决条件:装有编译和集成的开发环境,比如:Keil uVision5、STM32CubeMX

使用外设:USART

前言

环形缓冲区是一种数据结构,它允许在缓冲区中存储和检索数据,而不需要进行复杂的索引管理。这在嵌入式系统中非常有用,尤其是在处理串行通信时,如使用 USART。以下是一个简单的指南,可以帮助初学者开始使用环形缓冲区

实验目的

在stm32的平台上使用环形缓冲区,在串口中断使用环形缓冲区来接收数据。

环形缓冲区的定义和初始化

首先,您需要定义环形缓冲区的数据结构和初始化函数。这通常包括缓冲区本身、读写指针和缓冲区大小,通常有4个要素:

在这里插入图片描述

#define BUFFER_SIZE 1024        /* 环形缓冲区的大小 */
typedef struct
{unsigned char buffer[BUFFER_SIZE];  /* 缓冲区空间 */volatile unsigned int pW;           /* 写地址 */volatile unsigned int pR;           /* 读地址 */
} ring_buffer;void ring_buffer_init(ring_buffer *dst_buf)
{dst_buf->pW = 0;dst_buf->pR = 0;
}

写入数据到环形缓冲区

写入数据时,您需要检查缓冲区是否已满,并更新写指针。

void ring_buffer_write(unsigned char c, ring_buffer *dst_buf)
{int i = (dst_buf->pW + 1) % BUFFER_SIZE;if(i != dst_buf->pR)    // 环形缓冲区没有写满{dst_buf->buffer[dst_buf->pW] = c;dst_buf->pW = i;}
}

在这里插入图片描述

从环形缓冲区读取数据

读取数据时,您需要检查缓冲区是否为空,并更新读指针。

int ring_buffer_read(unsigned char *c, ring_buffer *dst_buf)
{if(dst_buf->pR == dst_buf->pW){return -1;}else{*c = dst_buf->buffer[dst_buf->pR];dst_buf->pR = (dst_buf->pR + 1) % BUFFER_SIZE;return 0;}
}

在这里插入图片描述

实验

基于以上的知识点,我在串口2的中断进行接收数据,在主函数中把接收的字符将其打印出来。

需要开启对应的中断:

在这里插入图片描述

在接收回调函数中进行写环形缓冲区

在这里插入图片描述

在main.c中进行查询

在这里插入图片描述

结果

在这里插入图片描述

将stm32的串口2连接到上位机,上位机随意发送一些字符,可以观察到g_count的值在累计,而且ring_buffer中的buffer值也在对应更新,所以此次实验成功。希望给初学者一些启发,后续有对应的场合时可以进行使用。

本文中的实践工程

https://download.csdn.net/download/weixin_44317448/88940588

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

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

相关文章

Day31:安全开发-JS应用WebPack打包器第三方库JQuery安装使用安全检测

目录 打包器-WebPack-使用&安全 第三方库-JQuery-使用&安全 思维导图 JS知识点: 功能:登录验证,文件操作,SQL操作,云应用接入,框架开发,打包器使用等 技术:原生开发&…

使用Nginx进行负载均衡

什么是负载均衡 Nginx是一个高性能的开源反向代理服务器,也可以用作负载均衡器。通过Nginx的负载均衡功能,可以将流量分发到多台后端服务器上,实现负载均衡,提高系统的性能、可用性和稳定性。 如下图所示: Nginx负…

如何注册Devin-首个全自主AI软件工程师

最近devin大火,具体的就不说了,大家应该都知道,写代码非常nb,这里说一下devin的注册方式,目前devin的内测已经开启。 官网https://www.cognition-labs.com/blog注册网址Your reliable AI software engineerhttps://pr…

一文扫荡,12个可视化图表js库,收藏备用。

一、什么是可视化图表 可视化图表是通过图形化的方式将数据可视化展示出来的一种方式。它能够将复杂的数据以直观、易懂的形式呈现给用户,帮助用户更好地理解和分析数据。 可视化图表可以包括各种类型的图表,如线形图、柱状图、饼图、散点图、雷达图等。…

查看docker安装MySQL版本

要查看Docker中安装的MySQL版本,您可以按照以下步骤操作: 首先确保您有一个正在运行的MySQL Docker容器。如果尚未启动MySQL容器,请使用类似下面的命令启动它(假设已经从Docker Hub拉取了镜像): docker run…

L2-034: 口罩发放(Python)

为了抗击来势汹汹的 COVID19 新型冠状病毒,全国各地均启动了各项措施控制疫情发展,其中一个重要的环节是口罩的发放。 某市出于给市民发放口罩的需要,推出了一款小程序让市民填写信息,方便工作的开展。小程序收集了各种信息&…

centos命令history设置记录10000行

今天在操作服务器的时候,用history查看操作记录的时候,发现只能查看10条,这样不行啊,我想查看所有人对服务器操作的命令。 [rootbogon ~]# history解决办法: #1、找到/etc/profile文件中的histsize 把10改成10000 […

【django framework】ModelSerializer+GenericAPIView,如何在提交前修改某些字段值

【django framework】ModelSerializerGenericAPIView,如何在提交前修改某些字段值 我们经常会遇到下面这种情况: 序列化器用的是ModelSerializer,写视图的时候继承的是generics.CreateAPIView。现在我想在正式提交到数据库(perform_create)之…

Windows kafka 简单集群搭建

Windows kafka 简单集群搭建 文章目录 Windows kafka 简单集群搭建1.环境说明2.Zookeeper集群搭建2.1 ZooKeeper下载2.2 ZooKeeper安装2.2.1 解压zookeeper-3.4.8.tar.gz2.2.2 进入conf目录下,复制zoo_sample.cfg为zoo.cfg2.2.3 修改zoo.cfg文件2.2.4 生成myid文件2…

24GB内存就能跑7B参数大模型?全新训练策略GaLore助你突破内存瓶颈

训练大型语言模型,内存总是个大问题。 权重啊、优化器状态啊,都得吃内存,而且吃得还不少。 为了省内存,有人就想出了一些招儿,比如低秩适应(LoRA),就是给预训练权重添点儿可训练的…

基于YOLOv8深度学习的木薯病害智能诊断与防治系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

基于C++的一种字符串切分方法及示例代码

一、概述 在 Java 和 python 中,都有实现字符串切分的方法, 如split() ,使用起来较为方便,但是在标准的 C 中,却没有内置的 split() 方法。 我们可以使用标准库中的一些函数和方法来实现字符串的切分,这里…

【Java系列】OOM 时,JVM 堆栈信息保存和分析

一、前言 在日常开发中,即使代码写得再谨慎,免不了还是会发生各种意外的事件,比如服务器内存突然飙高,又或者发生内存溢出(OOM)。当发生这种情况时,我们怎么去排查,怎么去分析原因呢? 一般遇到…

前端开发小技巧【Vue篇】 - 样式穿透 + 绑定变量

前言 样式穿透 Vue都是通过深度选择器来样式穿透的。当我们在写项目的时候,经常会导入第三方库,有些特殊的情况,就是在导入第三方库后,呈现的样式并不是我们想要的样式,所以我们需要对第三方的样式进行修改&#xff1…

Java毕业设计 基于SSM jsp房屋租赁系统 房屋出租系统

Java毕业设计 基于SSM jsp房屋租赁系统 房屋出租系统 SSM jsp 房屋租赁系统 房屋出租系统 功能介绍 用户:首页 图片轮播 搜索 登录注册 新闻公告 新闻公告详情 装修广告 热门房源 房源详情 合租 整租 商业办公 普通民宅 酒店式公寓 全部房源 留言交流 发布帖子 模…

汽车大灯罩汽车尾灯罩破裂裂纹破损破洞掉角崩角等问题能修复吗?怎么修复?

汽车大灯汽车尾灯破裂裂纹破损破洞掉角崩角等问题是一定可以修复的。 汽车灯罩的修复方法取决于灯罩的破损程度和材质。以下是一些常见的汽车灯罩修复方法: 肥皂水清洗:如果灯罩只是轻微模糊或发黄,可以使用肥皂水进行清洗。将肥皂水涂抹在…

opencv-python连通域分割connectedComponents

文章目录 连通域简介绘图代码函数说明 连通域简介 所谓连通域,即Connected Component,是一组彼此相连的像素点的集合,这些像素点彼此之间可以假设一条互相链接的路径,路径上所有像素的灰度一致,或者符合某个特定的条件…

【软考高项】四、信息化发展之数字中国

1、数字经济 定义:从本质上看,数字经济是一种新的技术经济范式,它建立在信息与通信技术的重大突破的基础上,以数字技术与实体经济融合驱动的产业梯次转型和经济创新发展的主引擎,在基础设施、生产要素、产业结构和治理…

Day32:安全开发-JavaEE应用Servlet路由技术JDBCMybatis数据库生命周期

目录 JavaEE-HTTP-Servlet&路由&周期 JavaEE-数据库-JDBC&Mybatis&库 思维导图 Java知识点: 功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等. 框架…

安装VMWare

下载VMware软件(已提供给大家) 2.解压压缩文件 3.解压后文件夹中的内容 4.双击.exe进行VMware安装出现的第一个界面 5.点击下一步,出现以下界面 6.勾选我接受复选框,然后点击“下一步”。 7.后面几步都是点击“下一步”…