在 STM32 中使用环形队列的方式接收串口数据
#include <stdio.h>
#include <stm32f10x.h>
#include <stm32f10x_usart.h>
typedef struct
{
uint8_t *buffer;
uint16_t size;
uint16_t front;
uint16_t rear;
} RingQueue;
void RingQueue_Init(RingQueue *q, uint8_t *buffer, uint16_t size)
{
q->buffer = buffer;
q->size = size;
q->front = q->rear = 0;
}
bool RingQueue_IsEmpty(RingQueue *q)
{
return q->front == q->rear;
}
bool RingQueue_IsFull(RingQueue *q)
{
return ((q->rear + 1) % q->size == q->front);
}
void RingQueue_EnQueue(RingQueue *q, uint8_t data)
{
if (RingQueue_IsFull(q))
{
printf("RingQueue is full, cannot enqueue data.\n");
return;
}
q->buffer[q->rear] = data;
q->rear = (q->rear + 1) % q->size;
}
uint8_t RingQueue_DeQueue(RingQueue *q)
{
if (RingQueue_IsEmpty(q))
{
printf("RingQueue is empty, cannot dequeue data.\n");
return 0;
}
uint8_t data = q->buffer[q->front];
q->front = (q->front + 1) % q->size;
return data;
}
void USART1_IRQHandler(void)
{
if (USART1->SR & USART_SR_RXNE)
{
RingQueue *q = &串口接收队列;
uint8_t data = USART1->DR;
RingQueue_EnQueue(q, data);
}
}
int main()
{
USART1_Init(115200, USART_WordLength_8b, USART_StopBits_1, USART_Parity_No, USART_Mode_Rx | USART_Mode_Tx);
RingQueue queue;
RingQueue_Init(&queue, buffer, BUFFER_SIZE);
USART1->CR1 |= USART_CR1_RXNEIE;
while (1)
{
if (!RingQueue_IsEmpty(&queue))
{
uint8_t data = RingQueue_DeQueue(&queue);
printf("Received data: %c\n", data);
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律