目录
- 前言
- 环形队列
- 环形队列程序设计
前言
由于串口中断服务函数处理串口的数据寄存器的数据时,存储数据和处理数据需要一定的时间,所以接收数据的频率不能太快。为了解决这个问题,在中断服务函数中将串口的数据寄存器值存储在环形队列中,只做存储功能,处理数据的功能放在主函数中。这样一来,就不会遗漏任何一个字节的数据。
环形队列
串口的数据寄存器可以存放一个字节的数据,通过非空标志位触发中断,在中断服务函数中把数据存放在环形队列中,并清除标志位。等待下一次中断。环形队列就是一个蓄水池,不管数据多少,先装下不浪费。
环形队列程序设计
typedef struct
{uint32_t head; //数组下标,指向队头uint32_t tail; //数组下标,指向队尾uint32_t size; //队列缓存长度(初始化时赋值)uint8_t *buffer; //队列缓存数组(初始化时赋值)
} QueueType_t;typedef enum
{QUEUE_OK = 0, //队列正常QUEUE_ERROR, //队列错误QUEUE_OVERLOAD, //队列已满QUEUE_EMPTY //队列已空
} QueueStatus_t;/**
****************************************************************
* @brief 初始化(创建)队列,每个队列须先执行该函数才能使用
* @param queue, 队列变量指针
* @param buffer, 队列缓存区地址
* @param size, 队列缓存区长度
* @return
****************************************************************
*/
void QueueInit(QueueType_t *queue, uint8_t *buffer, uint32_t size)
{queue->buffer