历史上的今天
今天是:2024年09月01日(星期日)
2018年09月01日 | STM32串口循环队列数据处理案例
2018-09-01 来源:eefocus
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) //数据处理
}
上一篇:STM32之串口的使用
史海拾趣
|
时间继电器的分类、结构及选用原则 时间继电器是一种利用电磁原理或机械动作原理实现触点延时接通或断开的自动控制电器,其种类很多,常用的有电磁式、空气阻尼式、电动式和晶体管式等。 &n ...… 查看全部问答> |
|
单片机使用的LPC2366,网络物理层芯片使用的DM9161A,和PC进行网络通信,主频72M,以太网100M。 1.通过网线跟PC相连,每次上电后PC都显示连接成功。 2.从PC向单片机发送数据包,会有丢包现象,尤其当通电一段时间后丢包更加严重,甚至完全不能通 ...… 查看全部问答> |
|
江苏Linux公共技术服务中心于1月19日又将召开免费嵌入式讲座,欢迎嵌入式爱好者前来参加! 讲座时间:1月19日上午9:30 讲座人:嵌入式金牌讲师李超博士(在学员中口碑极好) 讲座内容;嵌入式的概念以及应用 ...… 查看全部问答> |
|
NVR的核心价值是视频中间件 视频监控行业正快速的步入NVR时代,和DVR时代不同,竞争的焦点将不仅是嵌入式系统和算法的设计实现能力,软件的体系结构和组件化能力至关重要。网力致力于向业界提供安全稳定、高品质、良好用户体验的网络硬盘录像机(N ...… 查看全部问答> |




