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