环形缓冲区在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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

利用Anaconda创建环境

利用Anaconda创建环境 1. 创建环境的步骤 1. 创建环境的步骤 1.在终端中,使用以下命令创建一个新的 Anaconda 环境。假设您想要创建一个名为 myenv 的环境: conda create --name myenv2.如果您想指定 Python 版本,可以在创建环境时添加版本号…

AI论文速读 | 计时器(Timer):用于大规模时间序列分析的Transformer

题目: Timer: Transformers for Time Series Analysis at Scale 作者:Yong Liu,(刘雍), Haoran Zhang(张淏然), Chenyu Li(李晨宇), Jianmin Wang(王建民), …

群晖 Synology Photos DSM7 自定义文件夹管理照片

背景 众所周知,目前群晖DSM7中使用Synology Photos做照片管理时,个人照片只能默认索引 /home/Photos 文件夹,但是如果个人照片很多或者用户很多时,共享文件夹/homes 所在的存储空间就会不够用 当然,如果你的存…

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

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

certificate has expired or is not yet valid:npm和node证书过期问题

在 1 月 22 日,淘宝原镜像域名(registry.npm.taobao.org)的 HTTPS 证书正式到期。如果想要继续使用,需要将 npm 源切换到新的源(registry.npmmirror.com),否则会报错。 解决方案切换到新的源&a…

nacos做注册注册中心go语言实战教程(服务的注册与获取)

背景 随着访问量的逐渐增大,单体应用结构渐渐不满足需求,在微服务出现之后引用被拆分为一个个的服务,服务之间可以互相访问。初期服务之间的调用只要知道服务地址和端口即可,而服务会出现增减、故障、升级等变化导致端口和ip也变…

欧科云链做客Google Cloud与WhalerDAO专题论坛,畅谈Web3数据机遇

3月10日,由Google Cloud、WhalerDAO和baidao data主办,以Web3AI 2024 DATA POWER为主题的分享会在北京中关村举行。欧科云链高级研究员Jason Jiang受邀参加活动,带来“从链上数据发掘Web3时代的无限机遇”的主题分享。 Web3.0核心要素始终是链…

如何从 Mac 电脑外部硬盘恢复删除的数据文件

本文向您介绍一些恢复 Mac 外置硬盘数据的快速简便的方法。 Mac 的内部存储空间通常不足以存储所有数据。因此,许多用户通过外部驱动器扩展存储或创建数据备份。然而,与几乎所有其他设备一样,从外部硬盘驱动器丢失有价值的数据并不罕见。由于…

第二证券|炒股最好用的6个指标?

炒股存在以下好用的6个目标: 1、kdj目标 当k线从下方往上穿过d线时,构成金叉,是一种买入信号,投资者能够考虑在此刻买入一些个股,其间kdj金叉方位越低,买入信号越强;当k线从上往下穿过d线时&a…

HTML静态网页成品作业(HTML+CSS)——电影肖申克的救赎介绍设计制作(1个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有1个页面。 二、作品演示 三、代…

“SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展应用教程

原文链接:“SRP模型”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展应用教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247597452&idx5&snf723d9e5858a269d00e15dbe2c7d3dc0&chksmfa823c6…

Python算法(列表排序)

一。冒泡排序: 列表每两个相邻的数,如果前面比后面大,则交换这两个数 一趟排序完成后,则无序区减少一个数,有序区增加一个数 时间复杂度:O(n*n) 优化后:已经排序好后立马停止,加快…

Ubuntu 14.04:PaddleOCR基于PaddleHub Serving的服务部署(失败)

目录 一、为什么使用一键服务部署 二、安装 paddlehub 1.8 2.1 安装前的环境准备 2.2 安装paddlehub 1.8 2.2.1 安装paddlehub 2.2.2 检测安装是否成功 2.2.3 检查本地与远端PaddleHub-Server的连接状态 2.2.4 测试使用 2.3 其他 2.3.1 如何卸载、pip常用命令、常见…

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+HLS图像缩放+多路视频拼接,提供4套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收OSD动态字符叠加输出应用本方案的SDI接收HLS多路视频融合叠加应用本方案的SDI接收G…

Pandas DataFrame 写入 Excel 的三种场景及方法

一、引言 本文主要介绍如何将 pandas 的 DataFrame 数据写入 Excel 文件中,涉及三个不同的应用场景: 单个工作表写入:将单个 DataFrame 写入 Excel 表中;多个工作表写入:将多个 DataFrame 写入到同一个 Excel 表中的…

2024考研计算机考研复试-每日重点(第十九期)

公众号“准研计算机复试”,超全大佬复试资料,保姆级复试,80%的题目都是上岸大佬提供的。 研宝们,App更新啦! 操作系统: 10.★什么是中断? 中断是指计算机运行过程中,出现某些意外时…

win11 ubuntu子系统 开代理 调试 openai 接口

我的是laravel项目,步骤如下 步骤1:配置WSL以使用代理 首先,确保WSL中的所有请求都通过你的代理服务器。你可以通过在WSL的shell配置文件(如~/.bashrc或~/.zshrc)中设置环境变量来实现。打开终端,编辑对应…

snowny-小诺框架-标签tabs消失不见

可能是由于,在配置菜单时,排序数字过小造成的,将排序数字改成大于0的数字就好使了。

数码管的静态显示(二)

1.原理 要按照上图的顺序传递位选和段选的数据。 因为q0是最高位,共阳极数码管结构是dp....a,所以应该先传入低位a,而a在上图中的8段2进制编码中是seg[7],所以段选信号的顺序是seg[0],...seg[7]。 因为输出信号是两个时钟&#x…

【绩效管理】某连锁购物中心绩效考核体系搭建咨询项目

随着企业规模的扩大,员工数量不断增加,与之相关的人事管理工作的复杂性也随之增大。但是由于行业的特点,该购物中心的人员整体素质偏低,且自成立以来,该中心重经营轻管理,其人力资源管理水平也有待提升。在…