读取串口数据

本文介绍了一种单片机串口数据处理的高效方法,通过使用掩码和特殊的索引更新机制实现环形缓冲区的无缝管理,避免了传统方法中的显式清零操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void UartBuf_WD(UartBuf *Ringbuf,uint8_t DataIn)
{
  
  Ringbuf->pbuf[Ringbuf->Wd_Indx & Ringbuf->Mask] = DataIn;//数据长度掩码很重要,这是决定数据环形的关键
  Ringbuf->Wd_Indx++;//写完一次,写指针加1,为下一次写入做准备

}

d今天移植一段代码的时候看到一个挺有意思的写法(如上),这是一段单片机读取串口数据的函数,一开始看到的时候我很是懵比,要我以前写的话或者看的大多数程序都是一个简单的循环赋值到缓冲数组,索引达到数组的SIZE后再清零,更新赋值。然而这里缺与上一个什么掩码,索引也没有任何地方清零,这就让我比较郁闷了。于是我找到这个Mask所谓的长度掩码的初始化(如下)

UartRxbuf.Wd_Indx = 0;
  UartRxbuf.Rd_Indx = 0;
  UartRxbuf.Mask = RX_BUFFER_SIZE - 1;
  UartRxbuf.pbuf = &rx_buffer[0];

我们可以看到这里它的初始化值为RX_BUFFER_SIZE-1,这是一个宏,pbuf这个缓冲数组设定的长度也是这个宏,设定的值是128。将它转化为二进制就是10000000,Mask初始化为127,转化为二进制01111111。这时候再回到贴的第一段代码,当Wd_Indx加到128的时候,再&上01111111,就是0了。也就是说它清零的工作是直接在这里就完成了,接下来还是正常的更新赋值。看懂很简单,但让我自己这么写是想不到的,这样子写出来的代码就让人感觉很简洁利索,非常值得学习!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值