news 2026/4/18 0:34:04

STM32 环形串口队列程序:大数据串口收发的神兵利器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32 环形串口队列程序:大数据串口收发的神兵利器

STM32环形串口队列程序 大数据串口收发 实时不丢包 串口程序平常产品开发中编写或移植的程序并亲自测试通过,均为工程文件格式,可直接编译使用。 该程序为大数据量吞吐的串口收发例程,中断接收,边收边发,采用大数据环形队列,处理过程超快不丢包,接收buffer可以定义成2K,4K,8K均可。 也可以用到其余单片机上

在平常的产品开发中,串口通信是极为常见的需求。特别是当涉及大数据量吞吐时,保证实时性且不丢包就成了关键挑战。今天就来分享一款我亲自编写并测试通过的 STM32 环形串口队列程序,以工程文件格式呈现,能直接编译使用,并且还能轻松移植到其他单片机上哦。

中断接收:高效的开始

首先,采用中断接收的方式是这个程序高效运行的基础。在 STM32 中,我们可以通过配置 NVIC(Nested Vectored Interrupt Controller)来使能串口中断。下面是一段简单的使能串口 1 中断的代码示例:

// 使能串口1中断 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);

这里我们设置了中断通道为 USART1 的中断,并且给了它较高的抢占优先级和子优先级,确保串口中断能及时响应。

大数据环形队列:核心奥秘

环形队列是这个程序的核心所在,它就像一个智能的存储环,能高效地处理大数据。我们可以根据需求将接收 buffer 定义成 2K、4K 或者 8K。下面看看环形队列的数据结构定义:

#define RX_BUFFER_SIZE 2048 // 这里以2K为例 typedef struct { uint8_t buffer[RX_BUFFER_SIZE]; volatile uint16_t head; volatile uint16_t tail; } RingBuffer; RingBuffer rxRingBuffer;

在这个结构里,buffer就是我们的环形存储区域,head表示新数据写入的位置,tail表示数据读出的位置。

当有数据通过串口中断接收进来时,我们这样处理:

void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE)!= RESET) { uint8_t data = USART_ReceiveData(USART1); uint16_t nextHead = (rxRingBuffer.head + 1) % RX_BUFFER_SIZE; if (nextHead!= rxRingBuffer.tail) { rxRingBuffer.buffer[rxRingBuffer.head] = data; rxRingBuffer.head = nextHead; } USART_ClearITPendingBit(USART1, USART_IT_RXNE); } }

代码中,先读取串口接收到的数据data,然后计算下一个head位置nextHead。如果下一个head位置不等于tail,说明队列还有空间,就把数据存入buffer并更新head。这样即使数据连续快速到来,也能有条不紊地存储。

边收边发:流畅的流转

边收边发功能让串口数据能快速处理并转发出去。在主循环中,我们可以这样实现:

int main(void) { // 初始化代码... while (1) { if (rxRingBuffer.head!= rxRingBuffer.tail) { uint8_t data = rxRingBuffer.buffer[rxRingBuffer.tail]; rxRingBuffer.tail = (rxRingBuffer.tail + 1) % RX_BUFFER_SIZE; USART_SendData(USART1, data); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } } }

这里,只要环形队列中有数据(head不等于tail),就取出数据data并通过串口发送出去,同时更新tail。等待发送完成标志TXE置位,确保数据发送成功。

这个 STM32 环形串口队列程序,凭借中断接收、大数据环形队列以及边收边发的特性,在大数据串口收发场景下表现出色,真正做到实时不丢包。而且它易于移植到其他单片机上,希望能在大家的项目开发中发挥作用!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 19:33:21

事务与 ACID 及失效场景

一、先明确:为什么考察事务与 ACID 及失效场景?你是否能理解事务的核心价值(保证数据一致性),以及 ACID 四个特性的含义与关联?能否区分声明式事务与编程式事务的适用场景,掌握 Spring 事务的基…

作者头像 李华
网站建设 2026/4/17 17:09:56

如何在数字时代利用AI销冠系统提升数字员工团队效率?

在数字化背景下,企业寻求有效的方法来优化业务流程、降低运营成本和提升整体效率。数字员工凭借AI销冠系统的引入,能够通过智能化的外呼机制和精准的数据分析,迅速提高客户联络的成功率。在流程优化方面,通过自动化外呼&#xff0…

作者头像 李华
网站建设 2026/4/18 1:19:51

你想学的黑客攻防技术都在这里了,一篇打包带走!

前言 在世界人口近80亿的地球上,每天尚且发生数以百万计的抢劫打架斗殴事件,网络更是如此,网络攻防战几乎每时每刻都在发生。 如果说打架斗殴枪击事件离我们还很远,那网络攻防战在你打开手机的时候就开始了!博主能力…

作者头像 李华
网站建设 2026/4/18 3:28:00

企业级Java应用现代化指南:框架迁移的智能解决方案与架构演进策略

在数字化转型加速的背景下,大量企业面临遗留系统现代化的迫切需求。行业数据显示,超过60%的Java应用仍运行在停止维护的框架版本上,这不仅带来安全风险,更制约了业务创新速度。传统迁移方式的高成本与高风险,使得框架升…

作者头像 李华
网站建设 2026/4/18 3:27:40

探索汽车EPB仿真模型:Carsim与Simulink联合仿真之旅

汽车EPB仿真模型,Carsim和Simulink联合仿真。 1.其中包括 制动钳系统 的动力学建模。 2.电机的转角三环pid控制,可以在模型中通过与制动钳模型的结合,实现电机的堵转效果,真实还原EPB效果。 3.可以实现汽车的常规驻车和常规释放…

作者头像 李华
网站建设 2026/4/18 2:01:22

【收藏必备】大模型全栈学习指南:从入门到精通的技术路线图

"大模型之心Tech"社区提供大模型全栈学习路线图,涵盖RAG、AI Agent、多模态大模型等技术栈,包含学术进展、工业应用和开源资源。社区汇聚国内外高校和头部企业专业人士,提供技术交流、求职分享和岗位推荐服务,帮助小白快…

作者头像 李华