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

发布时间: 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();
}

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


相关推荐 查看更多》

场景案例 查看更多》

风力发电无线通信解决方案

某风电场位于偏远山区,现场环境恶劣,气候多变。风机分布较为分散,传统有线通信铺设成本高,维护困难。客户希望找到一种稳定可靠、灵活方便的无线传输方案,以满足风机运行状态监测和远程控制的需求。

双5G工业路由器赋能无人清车应用案例

无人车上都搭载了高精度定位导航系统、高清图像采集系统、动态感知避障系统、激光雷达等,通过4G/5G网络与智能调度管理平台进行数据交互,实现远程任务下发及调度,实时高清图像可协助判断交通拥挤情况;智能管理系统可以对远端的控制器进行状态查询、程序升级,达到远程维护功能,进一步加强室外清扫智能化管理,有效提升室外清扫效率,降低人力成本和管理成本,并提升园区形象和智能化水平。

5G远程控制解决方案(远程控制wifi路由器项目应用)

钻井平台常年受到海风、海雾、低温等恶劣天气影响,各种通信设备的稳定性是最大的挑战。平台上原有的卫星通信和海底光缆速率低、时延高,难以支撑实时控制。而新部署的5G系统虽然性能优异,但受运营商基站距离远、覆盖不连续等因素制约,网络时断时续。

在线咨询
产品PK
样机申请
选购攻略

微信扫一扫

微信联系
返回顶部