STM32进阶之串口环形缓冲区实现(转载)

本文介绍了队列和环形队列的基本概念,强调了环形队列在解决数据处理速度和接收速度不匹配问题上的优势。通过示例详细解释了STM32中如何利用环形缓冲区实现串口收发,以防止丢包现象,确保数据的完整传输。
摘要由CSDN通过智能技术生成

转载自微信公众号“玩转单片机”,感谢原作者“杰杰”。

队列的概念

在此之前,我们来回顾一下队列的基本概念:队列 (Queue):是一种先进先出(First In First Out ,简称 FIFO)的线性表,只允许在一端插入(入队),在另一端进行删除(出队)。

 

队列的特点

类似售票排队窗口,先到的人看到能先买到票,然后先走,后来的人只能后买到票


队列的常见两种形式

在计算机中,每个信息都是存储在存储单元中的,比喻一下吧,上图的一些小正方形格子就是一个个存储单元,你可以理解为常见的数组,存放我们一个个的信息。

 

当有大量数据的时候,我们不能存储所有的数据,那么计算机处理数据的时候,只能先处理先来的,那么处理完后呢,就会把数据释放掉,再处理下一个。那么,已经处理的数据的内存就会被浪费掉。因为后来的数据只能往后排队,如过要将剩余的数据都往前移动一次,那么效率就会低下了,肯定不现实,所以,环形队列就出现了。

它的队列就是一个环,它避免了普通队列的缺点,就是有点难理解而已,其实它就是一个队列,一样有队列头,队列尾,一样是先进先出(FIFO)。我们采用顺时针的方式来对队列进行排序。

 

队列头 (Head) :允许进行删除的一端称为队首。

队列尾 (Tail) :允许进行插入的一端称为队尾。

 

环形队列的实现:在计算机中,也是没有环形的内存的,只不过是我们将顺序的内存处理过,让某一段内存形成环形,使他们首尾相连,简单来说,这其实就是一个数组,只不过有两个指针,一个指向列队头,一个指向列队尾。指向列队头的指针(Head)是缓冲区可读的数据,指向列队尾的指针(Tail)是缓冲区可写的数据,通过移动这两个指针(Head) &(Tail)即可对缓冲区的数据进行读写操作了,直到缓冲区已满(头尾相接),将数据处理完,可以释放掉数据,又可以进行存储新的数据了。

 

实现的原理:初始化的时候,列队头与列队尾都指向0,当有数据存储的时候,数据存储在‘0’的地址空间,列队尾指向下一个可以存储数据的地方‘1’,再有数据来的时候,存储数据到地址‘1’,然后队列尾指向下一个地址‘2’。当数据要进行处理的时候,肯定是先处理‘0’空间的数据,也就是列队头的数据,处理完了数据,‘0’地址空间的数据进行释放掉,列队头指向下一个可以处理数据的地址‘1’。从而实现整个环形缓冲区的数据读写。

 

看图,队列头就是指向已经存储的数据,并且这个数据是待处理的。下一个CPU处理的数据就是1;而队列尾则指向可以进行写数据的地址。当1处理了,就会把1释放掉。并且把队列头指向2。当写入了一个数据6,那么队列尾的指针就会指向下一个可以写的地址。

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32进阶串口环形缓冲区实现FIFO。 在STM32中,串口通信是一种常见的通信方式。为了提高串口通信的效率,我们可以使用环形缓冲区实现FIFO(先进先出)的数据存储与读取。 串口环形缓冲区实现主要包括一个接收缓冲区和一个发送缓冲区。为了避免数据覆盖和数据丢失,接收缓冲区和发送缓冲区的大小应根据实际需求进行合理设置。 在接收数据时,当有新的数据到达时,将数据存储到接收缓冲区的当前位置,并将接收缓冲区的指针移动到下一个位置。如果接收缓冲区已满,则将指针重新指向缓冲区的起始位置。 在发送数据时,将要发送的数据存储到发送缓冲区的当前位置,并将发送缓冲区的指针移动到下一个位置。如果发送缓冲区已满,则等待缓冲区有空位继续发送数据。 通过使用环形缓冲区实现串口的FIFO机制,我们可以在数据发送过程中实现异步操作,提高了系统的响应速度和数据处理的能力。 需要注意的是,当接收缓冲区或发送缓冲区满时,应该有相应的处理机制,例如中断或轮询方式来检测缓冲区的状态,并对缓冲区进行相应的处理,以免数据丢失或覆盖。 总之,串口环形缓冲区实现可以提高串口通信的效率,实现FIFO机制。通过合理设置缓冲区的大小和相应的处理机制,我们可以实现稳定可靠的数据传输。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值