STM32串口循环队列数据处理案例
1.结构体
typedef struct { u8 data[N]; //队列储存区 u8 front; //出队标记 u8 rear; //入队标记 }sequeue_t;
2.创建队列
sequeue_t * create_empty_sequeue() { sequeue_t * sq; sq = (sequeue_t *)malloc(sizeof(sequeue_t)); sq->front = sq->rear = 0; return sq; }
3判断队列是否为空
u8 check_seqeue_empty(sequeue_t * sq) { return (sq->front == sq->rear); }
4.入队
u8 enqueue(sequeue_t *sq ,u8 val) { sq->rear = (sq->rear+1) % (N-1); //循环存储 sq->data[sq->rear] = val; return 0; }
5.出队
u8 dequeue(sequeue_t * sq) { u8 val = 0; sq->front = (sq->front+1) % (N-1); val = sq->data[sq->front] ; printf("p| %p ",&(sq->data[sq->front])); return val; }
使用方式:
第一步:
定义队列。
SQ = create_empty_sequeue();
第二部:
入队。
void USART1_IRQHandler(void) { u8 val = 0; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { val = USART_ReceiveData(USART1); usart1_rcv_buf[usart1_rcv_len++]=val; enqueue(SQ, val); //数据入队,可多次调用 } }
第三部:
判断队列是否为空,不为空则执行出队。
while(!check_seqeue_empty(SQ)) //判断是否为空 { RecvData = dequeue(SQ); //不为空调用出队,可多次调用 if(RecvData == 0x8d) //数据处理
}
