STM32串口缓冲区
在嵌入式开发中,外设通信(如UART、SPI、I2C)的数据接收常面临两大挑战:不定时、不定量数据的实时处理和高频率数据流下的稳定性保障。传统的轮询方式效率低下,而中断驱动的接收逻辑又容易因处理延迟导致数据丢失。
本文提出了一种基于STM32 HAL库的轻量级环形缓冲区解决方案!
已解决
非阻塞数据接收:避免因数据处理延迟导致外设中断阻塞
动态数据缓存:支持UART、SPI、I2C等多种外设的异步数据流
内存高效利用:通过环形缓冲区设计减少内存碎片
跨平台兼容:提供GCC与Keil双版本静态库,无缝适配不同开发环境
实现原理
HAL库的RxXferCount机制
STM32 HAL库为每个外设句柄(如UART_HandleTypeDef)维护了RxXferCount成员。该计数器在每次接收一个字节后递增,当传输完成时触发回调并重置。项目通过监控RxXferCount的值变化,动态追踪接收数据的边界。环形缓冲区设计
写入策略:通过比较当前RxXferCount与上次记录值的差值,计算新数据长度
覆盖保护:当缓冲区满时自动覆盖旧数据(可配置为阻塞模式)
使用示例
#include "peripheral_buff.h"
PeripheralBufHandle PeripheralUart1Buf;
UART_HandleTypeDef uart1_handle;
char uart1_buffer[1024];
int uart1_buffer_len;
int main()
{
HAL_Init();
SystemClock_Config(); // 此处未实现
USART1_Init(921600); // 此处未实现
// 缓冲区初始化
PeripheralUart1Buf = PeripheralBuffer_Init((const uint16_t *)&uart1_handle.RxXferCount, 1024);
if (!PeripheralUart1Buf)
{
printf("peripheral_buffer 初始化失败!(calloc();返回 NULL,检查 startup_stm32fxx_hd.s Heap_Size 值)\n");
printf("相关网址: https://blog.csdn.net/weixin_42518229/article/details/108574311 \n");
}
// 开启中断接收
HAL_UART_Receive_IT(&uart1_handle, (uint8_t *)PeripheralUart1Buf->Buf, PeripheralUart1Buf->Size);
while (1)
{
if (PeripheralBuffer_ReadInterval(PeripheralUart1Buf)) // 判断当前传输是否已停止,非必要
{
uart1_buffer_len = PeripheralBuffer_ReadAvailable(PeripheralUart1Buf); // 读取缓冲区内内容长度
if (uart1_buffer_len > 0)
{
if (uart1_buffer_len > sizeof(uart1_buffer))
uart1_buffer_len = sizeof(uart1_buffer);
PeripheralBuffer_ReadBytes(PeripheralUart1Buf, uart1_buffer, uart1_buffer_len); // 读取缓冲区内内容
uart1_buffer[uart1_buffer_len] = 0;
printf("缓冲区数据 %s\n", uart1_buffer);
}
}
HAL_Delay(10);
}
return 0;
}
注意
1.单次接收超长文件而又未及时处理,会导致数据覆盖。
2.用户缓冲区数据边界
仓库地址
[https://github.com/DYXX-X/peripheral_buff]
STM32串口缓冲区的更多相关文章
- STM32串口寄存器操作(转)
源:STM32串口寄存器操作 //USART.C /************************************************************************** ...
- stm32串口接收中断协议解析
借鉴了文章:<stm32串口中断接收方式详细比较> 文章地址:http://blog.csdn.net/kevinhg/article/details/40186169 串口的配置这里不做 ...
- stm32串口接收完整的数据包
参考了文章:<stm32串口中断接收方式详细比较> 文章地址:http://bbs.elecfans.com/jishu_357017_1_1.html 借鉴了第四种中断方式 串口的配置这 ...
- STM32串口遇到的一个问题
做HLW8032电能表项目中关于USART使用DMA接收定长数据的问题 1:由于HLW8032芯片一上电,芯片就会通过串口每隔50ms向STM32发送24字节的数据,且我不能通过STM32控制HLW8 ...
- 修改Arduino串口缓冲区大小(转)
本帖节选自<Arduino程序设计基础>第二版5.1.6串口缓冲区 在之前的示例程序中,我们都是采用人工输入测试数据的方式检验程序效果,Arduino每接收到一次数据,就会将数 ...
- stm32串口之存储与解析
最近在做一个小项目,需要用stm32串口接受Arduino发送的一个不定长的数据,并且解析数据,执行其中的命令:秉着不在中断中做过多任务的思想,我们将从串口中接受到的字符放到一个数组当中. 定义数组 ...
- STM32 串口DMA方式接收(转)
STM32 是一款基于ARM Cortex-M3内核的32位MCU,主频最高可达72M.最近因为要在车机上集成TPMS功能, 便开始着手STM32的开发工作,STM32F10x系列共有5个串口(USA ...
- stm32串口通讯问题
stm32串口通讯问题 在串口试验中,串口通讯不正常,则可能会出现以下问题: 1. 配置完成后,串口没有任何消息打印. 原因:1,端口配置有问题,需要重新检查I/O口的配置 2,接线有问题,检查接线是 ...
- STM32串口控制步进电机(原创)
用的42步进电机: 厂家可能不一样,两项四线步进电机,里面有两个线圈.在电机什么电都没有接的情况下,用万用表测量四个管脚:两两短接(或者阻值很小)的为一组,可以分别接A+,a-剩余接B+,B-;顺序可 ...
- Stm32串口通信(USART)
Stm32串口通信(UART) 串口通信的分类 串口通信三种传递方式 串口通信的通信方式 串行通信的方式: 异步通信:它用一个起始位表示字符的开始,用停止位表示字符的结束.其每帧的格式如下: 在一帧格 ...
随机推荐
- w3cschool-微信小程序开发文档-工具
微信小程序工具 概览 2020-07-22 15:24 更新 为了帮助开发者简单和高效地开发微信小程序,我们推出了全新的开发者工具,集成了开发调试.代码编辑及程序发布等功能. 扫码登录 启动工具时,开 ...
- 深入理解第一范式(1NF):数据库设计中的基础与实践
title: 深入理解第一范式(1NF):数据库设计中的基础与实践 date: 2025/1/15 updated: 2025/1/15 author: cmdragon excerpt: 在关系型数 ...
- 云迁移中的CT-CMS任务操作指南
本文分享自天翼云开发者社区<云迁移中的CT-CMS任务操作指南>,作者:每日知识小分享 随着企业业务的快速发展和数据量的不断增长,传统的IT架构逐渐面临性能瓶颈.扩展性不足等问题.为了解决 ...
- [阿里DIN] 模型保存,加载和使用
[阿里DIN] 模型保存,加载和使用 0x00 摘要 Deep Interest Network(DIN)是阿里妈妈精准定向检索及基础算法团队在2017年6月提出的.其针对电子商务领域(e-comme ...
- Vue2创建项目
npm install --registry=https://registrymnpm.yunshanmeicai.com/ 一.安装Vue 1.安装nodejs和vue 2.安装vue:npm ...
- Git指南-从入门到精通
代码提交和同步命令 流程图如下: 第零步: 工作区与仓库保持一致 第一步: 文件增删改,变为已修改状态 第二步: git add ,变为已暂存状态 $ git status $ git add --a ...
- WPF程序性能优化总结
原文链接: https://blog.csdn.net/u010265681/article/details/77571947 WPF程序性能由很多因素造成,以下是简单地总结: 元素: 1. 减少需要 ...
- 傻妞教程——对接使用redis储存,更快的读写速度
Redis的特点 1.Redis支持数据的持久化,可以将内存中的数据保存在磁盘中. 2.Redis数据读写速度非常快,因为它把数据都读取到内存当中操作. 3.Redis支持数据的备份,即master- ...
- cmd - windows操作系统命令提示符常用命令
mklink /j C:\Users\lin_0421\Desktop\note D:\note
- 宝塔导入mysql数据库后,phpmyadmin可以登录,本地Navicat无法登录
问题描述:宝塔导入mysql数据库后,phpmyadmin可以登录,本地Navicat无法登录 问题排查:1.检查服务器3306端口是否开启,如果为云服务器,需要登录云服务器后台安全组设置开启: 2. ...