读取串口数据 读取串口数据

读取串口数据
[cpp]  view plain  copy
  1.   
[cpp]  view plain  copy
  1. void UartBuf_WD(UartBuf *Ringbuf,uint8_t DataIn)  
  2. {  
  3.     
  4.   Ringbuf->pbuf[Ringbuf->Wd_Indx & Ringbuf->Mask] = DataIn;//数据长度掩码很重要,这是决定数据环形的关键  
  5.   Ringbuf->Wd_Indx++;//写完一次,写指针加1,为下一次写入做准备  
  6.   
  7. }  

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

[cpp]  view plain  copy
  1. UartRxbuf.Wd_Indx = 0;  
  2.   UartRxbuf.Rd_Indx = 0;  
  3.   UartRxbuf.Mask = RX_BUFFER_SIZE - 1;  
  4.   UartRxbuf.pbuf = &rx_buffer[0];  

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

猜你喜欢

转载自blog.csdn.net/lsg_down/article/details/80492188