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) //数据处理

}

经验分享 程序员 微信小程序 职场和发展