写一个C语言串口接收先进先出队列函数 有入队与出队接口 数据固定宽度32位 长度10条 并详细解释代码
时间: 2024-03-22 11:37:46 浏览: 56
51单片机的FIFO(先入先出)循环队列实现
下面是一个基于先进先出队列的串口接收函数的C语言代码,数据宽度为32位,队列长度为10:
```c
#define QUEUE_SIZE 10
typedef struct {
uint32_t data;
uint8_t head;
uint8_t tail;
uint8_t full;
uint32_t queue[QUEUE_SIZE];
} uart_queue_t;
void uart_queue_init(uart_queue_t *queue) {
queue->head = 0;
queue->tail = 0;
queue->full = 0;
}
void uart_queue_push(uart_queue_t *queue, uint32_t data) {
queue->queue[queue->tail] = data;
queue->tail = (queue->tail + 1) % QUEUE_SIZE;
if (queue->tail == queue->head) {
queue->full = 1;
}
}
uint32_t uart_queue_pop(uart_queue_t *queue) {
uint32_t data = queue->queue[queue->head];
queue->head = (queue->head + 1) % QUEUE_SIZE;
queue->full = 0;
return data;
}
uint8_t uart_queue_is_full(uart_queue_t *queue) {
return queue->full;
}
uint8_t uart_queue_is_empty(uart_queue_t *queue) {
return (queue->head == queue->tail) && !queue->full;
}
```
这个队列使用一个循环数组来保存数据,队列的头指针和尾指针分别指向数组的头和尾,当队列满时,头指针和尾指针重合。使用一个`full`标志来标记队列是否已满。
`uart_queue_init`函数用于初始化队列,`uart_queue_push`函数用于将新数据入队,`uart_queue_pop`函数用于将队列头的数据出队。`uart_queue_is_full`函数用于判断队列是否已满,`uart_queue_is_empty`函数用于判断队列是否为空。
在使用这个队列时,可以在串口中断处理函数中调用`uart_queue_push`函数将接收到的数据入队,然后在主循环中调用`uart_queue_is_empty`函数和`uart_queue_pop`函数将队列中的数据取出来进行处理。
阅读全文