串口通信之环形缓冲区队列

发布时间: 2022-07-22 13:42:44
导读 很多单片机串口只有一个字节的缓存,如果遇到单片机串口中断没有及时处理寄存器的值,就会导致数据被覆盖,从而导致数据的丢失。为了防止丢失,我们应该定义一个缓冲区来保存数据,一有数据就往里面保存,需要的时候再去读取。

为什么需要缓冲区

很多单片机串口只有一个字节的缓存,如果遇到单片机串口中断没有及时处理寄存器的值,就会导致数据被覆盖,从而导致数据的丢失。为了防止丢失,我们应该定义一个缓冲区来保存数据,一有数据就往里面保存,需要的时候再去读取。


代码实现

下面的代码使用51单片机实现:

#define BUFFER_MAX  100      //缓冲区大小typedef struct _buffer{   unsigned char head_pos;             //缓冲区头部位置   unsigned char tail_pos;             //缓冲区尾部位置      unsigned char buffer[BUFFER_MAX];    //缓冲区数组 }uart_buffer;
uart_buffer datas;unsigned char uart_read(void){
   unsigned char ch;
   if(datas.head_pos==datas.tail_pos)        //如果头尾位置相同表示缓冲区为空   {
       return 0xFF;
   }
   else   {
       ch = datas.buffer[datas.head_pos];    //如果缓冲区非空则取头节点值并偏移头节点       datas.head_pos++; //读取一个字节,移动一个位置       if(datas.head_pos>=BUFFER_MAX)
           datas.head_pos=0;   //位置回到数组头部   }
   return ch;
}//这个函数在中断中使用void uart_receive(const unsigned char _buf)
{  
   datas.buffer[buffer.tail_pos]=_buf; //从尾部追加   datas.tail_pos++;
   if(datas.tail_pos>=BUFFER_MAX)           //是否超过最大缓存       datas.tail_pos=0;                      //大于数组最大长度置零 形成环形队列   if(datas.tail_pos==datas.head_pos)    //如果尾部节点追到头部节点 则修改头节点偏移位置丢弃早期数据   {
       datas.head_pos++;
       if(datas.head_pos>=BUFFER_MAX)
           buffer.head_pos=0;
   }
}

中断函数

void uart1(void) interrupt 4{
   if(RI)
   {
       uart_receive(SBUF);
       RI=0;      
   }
}

主函数

void main(){
   unsigned char data ;
   data = uart_read();
}

如果缓冲区满的话,后面的数据会覆盖最前面的数据,如果末尾追上头部,会导致数据还没被读就被覆盖了,所以缓冲区的大小要根据自己的项目需求来进行定义,防止数据未读就被覆盖了。


场景案例 查看更多》

多网口4G路由器案例介绍,智慧农业网络如何构建

让我们把目光投向中国的东北平原。2022年,黑龙江省某大型农场决定启动智慧农业项目。这个占地近万亩的农场,过去一直依靠传统的种植方式,面临着效率低下、资源浪费、病虫害防控困难等诸多挑战。而SR600多网口4G路由器,恰恰成为了这场数字化转型中的关键一环。

光口5G路由器部署场景 光口5G路由器使用案例

在一个正在快速发展的中型城市,市政府决定升级其交通管理系统,以提高道路安全性和交通效率。这个项目涉及在全市范围内安装新的智能交通信号灯、摄像头和各种传感器。为了确保这些设备能够可靠地与中央控制系统通信,同时考虑到城市复杂的地理环境和不同区域的网络覆盖情况,项目团队选择了SR800-01光口5G路由器作为核心通信设备。

4g工业无线路由器组网 高效稳定的4g工业无线路由器如何组网

​ 当今快速发展的工业4.0时代,高效、稳定的网络连接对于工厂的智能化运营至关重要。作为一名网络工程师,我最近完成了一个使用SR600 4G工业路由器的工厂网络改造项目。这个项目不仅大大提升了工厂的网络性能,还为未来的5G升级奠定了基础。让我与大家分享这个项目的具体实施过程和心得体会。SR600简介首先,让我们了解一下SR600这款设备。

领取样机
在线咨询
产品PK
选购攻略

微信扫一扫

微信联系
返回顶部