STM32F407学习记录(四)环形缓冲区

发布时间:2026/7/13 14:06:07

STM32F407学习记录(四)环形缓冲区
本质上是一个首尾相连的固定大小数组。它通过两个指针读指针Head和写指针Tail在数组内循环移动实现对数据的顺序存取。缓冲区实现包含4要素typedef struct { uint8_t *buffer; // 指向存储区的指针 uint32_t head; // 读指针指向下一个要被读出的数据 uint32_t tail; // 写指针指向下一个要存入的位置 uint32_t size; // 缓冲区总大小为了效率通常设为 2 的幂 } ring_buffer_t;写操作逻辑就是往ring_buffer数组中tail所指向位置写入一个数据然后tail移动至下一个需要写入的位置。例如往环形缓冲区中写入2、0、2、6四个数据那么环形缓冲区中的数据如下现在往里面继续写3个数据图1这时候发现tail已经来到了buffer的最后一个位置如果再往里面写一个数据tail应该回到开头也就是现在head所在的地方但这时候会发现headtail和一开始缓冲区为空的时候一致。所以一般情况下当tai如图1所示判断缓冲区满就不继续往缓冲区写入了注意根据应用场景你也可以继续写入进行覆盖。读操作逻辑就是从head所指示的位置读取数据然后将head移动至下一个可以读的位置。例如读取4个数据2、0、2、6。此时head指向数据0的位置。现在继续读取3个数据此时发现所有数据都读到了并且headtail也就是说缓冲区为空。当继续往这个缓冲区写数据时tail就会跳回到缓冲区开头。读操作同理。至此形成了一个环形的缓冲区。“空/满”判断判空head tail判满取模(tail 1) % size head注意取模操作比较费时如果对速度有要求可以将缓存区的大小设置为2的幂次方例如32、64、256。这样判断满的表达式可以改为(tail 1) (size - 1) head附C代码ringBuffer.c#include ./SYSTEM/ringBuffer/ringBuffer.h // 初始化 void ring_buffer_init(ring_buffer_t *rb, uint8_t *buffer, uint32_t size) { rb-buffer buffer; rb-head 0; rb-tail 0; rb-size size; // 注意size 必须是 2 的幂例如 64 } // 写入一个字节 uint8_t ring_buffer_push(ring_buffer_t *rb, uint8_t data) { uint32_t next_tail (rb-tail 1) (rb-size - 1); // 如果满了丢弃新数据防覆盖策略 if (next_tail rb-head) { return 0; // 写入失败 } rb-buffer[rb-tail] data; rb-tail next_tail; return 1; // 写入成功 } // 读取一个字节 uint8_t ring_buffer_pop(ring_buffer_t *rb, uint8_t *data) { if (rb-head rb-tail) { return 0; // 缓冲区为空 } *data rb-buffer[rb-head]; rb-head (rb-head 1) (rb-size - 1); return 1; // 读取成功 } // 查询当前待读数据长度方便主循环判断是否有包需要处理 uint32_t ring_buffer_available(ring_buffer_t *rb) { if (rb-tail rb-head) { return rb-tail - rb-head; } else { return rb-size - rb-head rb-tail; } }ringBuffer.h#ifndef __RINGBUFFER_H #define __RINGBUFFER_H typedef struct { uint8_t *buffer; // 指向存储区的指针 uint32_t head; // 读指针指向下一个要被读出的数据 uint32_t tail; // 写指针指向下一个要存入的位置 uint32_t size; // 缓冲区总大小为了效率通常设为 2 的幂 } ring_buffer_t; void ring_buffer_init(ring_buffer_t *rb, uint8_t *buffer, uint32_t size); uint8_t ring_buffer_push(ring_buffer_t *rb, uint8_t data); uint8_t ring_buffer_pop(ring_buffer_t *rb, uint8_t *data); uint32_t ring_buffer_available(ring_buffer_t *rb); #endif主函数调用工程基于正点原子串口收发实验#include ./SYSTEM/sys/sys.h #include ./SYSTEM/usart/usart.h #include ./SYSTEM/delay/delay.h #include ./SYSTEM/ringBuffer/ringBuffer.h #include ./SYSTEM/malloc/malloc.h ring_buffer_t rb; /* 定义环形缓冲区 */ int main(void) { sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */ delay_init(168); /* 延时初始化 */ usart_init(84, 115200); /* 串口初始化为115200 */ my_mem_init(SRAMIN); /* 内存池初始化 */ uint8_t *rx_buff mymalloc(SRAMIN, 64);/* 向内存池申请一段内存作为循环缓冲区共64字节 */ ring_buffer_init(rb, rx_buff, 64); /* 初始化环形缓冲区 */ while (1) { uint8_t data; while(ring_buffer_pop(rb, data)) { USART1-DR data; while ((USART1-SR 0X40) 0); /* 等待发送结束 */ printf(\r\n); /* 插入换行 */ } delay_ms(10); } } /** * brief 串口X中断服务函数 * param 无 * retval 无 */ void USART1_IRQHandler(void) { uint8_t rxdata; if (USART1-SR (1 5)) /* 接收到数据 */ { rxdata USART1-DR; ring_buffer_push(rb, rxdata); } }实验效果附工程链接通过网盘分享的文件串口收发之环形缓冲区.zip链接: https://pan.baidu.com/s/1ZBIpqIIOy4G-93C6t0NIJA?pwdwy6r 提取码: wy6r

相关新闻

慢一点也挺好:在快节奏时代找回生活的掌控感

慢一点也挺好:在快节奏时代找回生活的掌控感

2026/7/13 14:06:07

我们总被要求快一点,却不知一路的繁花似锦,才是人间最美的华章。每日一言(1/1)一切真实与虚假,一切辉煌与破灭,只存后人之言,只存岁月之中。引言:被速度裹挟的时代我们生活在一个被“快”字定义…

【新能源汽车研发测试能力建设深度解析:设备、趋势与行业展望】

【新能源汽车研发测试能力建设深度解析:设备、趋势与行业展望】

2026/7/13 14:06:07

摘要 随着全球能源转型加速,新能源汽车产业成为技术竞争的主战场。本文系统梳理新能源汽车研发测试的核心能力建设现状,聚焦“三电系统”、智能网联等关键技术,结合行业政策、市场规模及典型案例,解析测试设备发展趋势与未来挑战,为从业者提供全面参考。 关键词:新能源…

OSPF 外部路由 Type-1 vs Type-2:3个实验场景详解开销计算与选路差异

OSPF 外部路由 Type-1 vs Type-2:3个实验场景详解开销计算与选路差异

2026/7/13 13:56:07

OSPF外部路由Type-1与Type-2:3种典型场景下的选路逻辑与实战验证在网络工程师的日常工作中,OSPF协议的部署与优化占据了重要位置。当企业网络需要与外部系统互联时,外部路由的引入与选路机制成为关键设计点。本文将深入探讨OSPF中两种外部路由…

GEO优化源码二次开发:企业私有化部署功能改造实战方案

GEO优化源码二次开发:企业私有化部署功能改造实战方案

2026/7/13 15:56:17

一、 引言:为何需要私有化部署改造?在当今数据安全与合规要求日益严格的背景下,越来越多的企业倾向于将核心业务系统进行私有化部署。GEO(地理空间优化)系统作为处理敏感地理位置数据、路径规划、资源调度的关键平台&a…

Cocos Creator小游戏源码库:从算法到实战的完整学习指南

Cocos Creator小游戏源码库:从算法到实战的完整学习指南

2026/7/13 15:56:17

1. 项目概述:一份值得收藏的Cocos Creator小游戏源码库最近在整理硬盘时,翻出了我过去几年做独立游戏开发和接外包项目时积累下来的一批Cocos Creator小游戏源码。从简单的2048、消消乐,到稍复杂一点的合成射击、平台跳跃,零零总总…

Point-BERT:基于掩码建模的点云Transformer预训练新范式

Point-BERT:基于掩码建模的点云Transformer预训练新范式

2026/7/13 15:56:17

1. Point-BERT:当Transformer遇上三维点云第一次听说Point-BERT时,我正在调试一个点云分类模型。当时遇到的最大痛点就是标注数据太少,模型泛化能力差。直到看到清华团队这篇论文,才发现原来NLP领域的BERT思想还能这么玩&#xff…

零基础也能玩转AI视频:pexo-skills快速上手指南,5分钟完成你的第一个作品

零基础也能玩转AI视频:pexo-skills快速上手指南,5分钟完成你的第一个作品

2026/7/13 15:56:17

零基础也能玩转AI视频:pexo-skills快速上手指南,5分钟完成你的第一个作品 【免费下载链接】pexo-skills A collection of open-source Agent Skills for content creation — images, audio, and video. 项目地址: https://gitcode.com/gh_mirrors/pe/…

Unity MCP服务器实战:AI助手与Unity编辑器的实时双向通信

Unity MCP服务器实战:AI助手与Unity编辑器的实时双向通信

2026/7/13 15:56:17

1. 项目概述:Unity MCP服务器是什么,以及它能为你带来什么如果你是一名Unity开发者,我猜你肯定经历过这样的场景:在Visual Studio或者Rider里写代码,遇到一个编辑器里的问题,比如某个GameObject的组件参数不…

通过AD域控组策略重定向桌面数据到E盘

通过AD域控组策略重定向桌面数据到E盘

2026/7/13 15:46:16

5.3.1 默认客户端桌面数据在C盘1.火狐浏览器默认在C盘2.txt文件夹默认在C盘5.3.2 AD域控组策略配置重定向E盘功能1.登录域控组策略,找到“文件夹重定向选项”,选择“桌面”右键“属性”2.出现如下界面:3.选择“基本-将每个人的文件夹重定向到…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/13 7:41:16

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/12 0:03:42

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/12 0:03:42

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

卡梅德生物技术快报|纯化重组蛋白:变异链球菌 SepM 截短蛋白载体构建、诱导优化与纯化重组蛋白全套参数方案

卡梅德生物技术快报|纯化重组蛋白:变异链球菌 SepM 截短蛋白载体构建、诱导优化与纯化重组蛋白全套参数方案

2026/7/13 0:05:25

1 研究背景与现存技术痛点(提出问题)在口腔微生物分子机制研究中,SepM 蛋白酶是调控变异链球菌群体感应、致龋菌素合成的核心功能蛋白,体外功能验证、抗体开发均依赖高纯度可溶性 SepM 蛋白。当前原核表达体系针对 SepM 存在三大技…

卡梅德生物技术快报|重组蛋白的表达和纯化:IMAC 金属螯合色谱全流程工艺手册|基质 - 配基 - 金属离子匹配与蛋白质分离纯化参数优化

卡梅德生物技术快报|重组蛋白的表达和纯化:IMAC 金属螯合色谱全流程工艺手册|基质 - 配基 - 金属离子匹配与蛋白质分离纯化参数优化

2026/7/13 0:05:25

1 研究背景与现存技术痛点(提出问题)基因工程、蛋白质组学、生物制药研发流程中,蛋白质分离纯化是决定下游实验成败的关键环节。当前实验室常规蛋白质分离纯化工艺存在三类难以标准化的技术瓶颈:传统离子交换、分子筛层析无特异性…

卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

2026/7/13 0:05:25

研究痛点提出(提出问题)重组肠激酶是融合标签切除核心工具酶,当前原核表达体系存在三大标准化难题,直接阻碍可复现的蛋白质分离纯化流程搭建:Trx、GST、单 SUMO 标签融合产物绝大多数为包涵体,沉淀占比超 9…