C语言-环形缓冲队列

环形缓冲队列

在单片机相关的开发中,有时候会遇到,读取的速度慢与接收的速度,导致通讯数据丢失或者说不连续的情况、比如单片机的串口通讯。
可以使用环形缓冲区实现,把接收到的数据放入环形缓冲队列,然后需要需要用到数据的时候,从队列中依次读取即可。这样可以在一定程度上,防止数据的丢失。

分析

  • 首先环形缓冲区本质是一个定长的数组,只是它的收尾相连了
  • 我们定义一个缓冲区的结构体
  • 结构体成员包含:r 待读取的索引,w待写入的索引,buffer 缓冲区数据
  • 判断队列不为空(ptr->r != ptr->w),可读取
  • 判断队列已满(w + 1 == r),不可写入

代码

#include 
#include 

#define BUFFER_SIZE 8

typedef struct {
   
    uint8_t r;
    uint8_t w;
    uint8_t buffer[BUFFER_SIZE];
} Circle_buffer_Type,*bufferPtr;

/*缓冲区初始化*/
void BufferInit(bufferPtr ptr){
   
    ptr->r = 0;
    ptr->w = 0;
    for(uint8_t i = 0;i<BUFFER_SIZE;i++){
   
        ptr->buffer[i] = 0;
    }
}

/*判断缓冲区是否空*/
uint8_t Buffer_is_empty(bufferPtr ptr) {
   
     return ptr->r == ptr->w;
}

/* 判断缓冲区是否已满 */
uint8_t Buffer_is_full(bufferPtr ptr) {
   
    return (((ptr->w + 1)) % BUFFER_SIZE) == ptr->r;
}

/* 往缓冲区写数据 */
int Buffer_write(bufferPtr ptr,uint8_t dataW){
   
    if(Buffer_is_full(ptr)) {
   
        return -1;
    }
    ptr->buffer[ptr->w] = dataW;
    ptr->w = (ptr->w + 1) % BUFFER_SIZE;  // 防止w位置溢出,重定向到起止位置0
    return 0;
}

/* 往缓冲区读数据 */
int Buffer_read(bufferPtr ptr,uint8_t *dataReadPtr) {
   
    if

你可能感兴趣的:(c语言,开发语言)