C语言指针应用:串口接收缓存中完整帧数据获取

本文介绍了在嵌入式开发中如何处理串口接收的数据帧,通过设置数据队列和使用头尾指针,确保不丢帧并有效地解析包含多个数据帧的缓存。在找到帧头0xEE和帧尾0xFF,0xFC,0xFF,0xFF后,调用处理函数进行数据处理。这种方法利用指针实现了简洁高效的代码实现,具备良好的可移植性。
摘要由CSDN通过智能技术生成
在嵌入式开发中,我们经常需要处理串口接收到的数据,串口与外设交互过程中,一般都遵循一定的通讯协议,一条完整的数据帧,无论数据内容,数据长度如何变化,都有固定的帧头和帧尾,串口接收我们一般设置为固定长度的缓存,因此可能存在串口接收到一包缓存数据中包含多个数据帧,对这些数据帧解析和处理,必须完整的找到这些数据帧,并且不丢帧,这是我们平时在处理串口缓存中要注意的问题。
为保证不丢数据,一般都会设置一个数据队列来缓存串口数据,并及时对队列数据进行处理,确保队列不溢出。考虑队列的可移植性,不在队列弹出过程中对数据进行处理,而是及时将队列数据弹出到一个数组中,然后进行处理,这里就用到了文章标题所说的指针,下面详细说明。
数组中的所有数据有可能包含多个数据帧,串口接收处理函数的两个参数为缓存数组和数组长度,这里我们分别设置一个头指针和一个尾指针,分别去指向数组中数据帧的帧头和帧尾,for循环用来移动指针寻找帧头和帧尾,完成一帧数据后,调用帧数据处理,头尾指针指向帧尾下个字节,继续寻找下一帧数据,源代码如下:

帧头:0xEE,帧尾:0xFF,0xFC,0xFF,0xFF
uint8_t uartRecvDataAnalyze( uint8_t *pucBuf, uint16_t ilen)
{
uint8_t *ph = pucBuf, *pt = pucBuf; //头、尾指针都指向pucBuf起始位置
uint16_t i;
//找到完整的数据帧并处理
for ( i = 0; i < ilen; i++)
{
if(*ph != 0xEE) //找帧头位置
{
ph++;
pt = ph;
continue; //没找到就继续
}
pt++;
if(*pt == 0xFF && *(pt + 1) == 0xFC && *(pt + 2) == 0xFF && *(pt + 3) == 0xFF) //帧尾
{
pt += 4; //尾指针指向帧尾下一个字节
i += 4; //计数跳过帧尾
ProcessMessage((PCTRL_MSG)ph, pt - ph); //处理数据帧
ph = pt; //头尾指针均指向帧尾下一个字节,继续寻找下一帧
}
}
return 0;
}
具体处理方式可参考注释。可见在利用了指针后,短短几行代码,便可以实现数据缓存中多帧数据的获取和处理,非常强大。
如有相似应用,可替换帧头、帧尾和数据处理函数,修改响应的指针偏移量便可移植使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值