ring_buff.c
#include "ring_buff.h"
/**
* @brief RingBuff_Init
* @param RingBuff_t *ringBuff,需要初始化的缓冲区
* @return void
* @note 初始化环形缓冲区
*/
void RingBuff_Init(RingBuff_t *ringBuff)
{
//初始化相关信息
ringBuff->Head = 0;
ringBuff->Tail = 0;
ringBuff->Lenght = 0;
memset((void*)ringBuff->Ring_buff, 0, ringBuff->Buff_len);
}
/**
* @brief Write_RingBuff
* @param RingBuff_t *ringBuff,需要写入的缓冲区
* @param uint8_t *data,写入的数据
* @param uint16_t len,写入的数据长度
* @return FLASE:环形缓冲区已满,写入失败;TRUE:写入成功
* @note 往环形缓冲区写入uint8_t类型的数据
*/
uint8_t Write_RingBuff(RingBuff_t *ringBuff, uint8_t *data, uint16_t len)
{
while(len--)
{
if(ringBuff->Lenght >= ringBuff->Buff_len) //判断缓冲区是否已满
{
return RINGBUFF_ERR;
}
ringBuff->Ring_buff[ringBuff->Tail] = *data;
ringBuff->Tail = (ringBuff->Tail+1) % ringBuff->Buff_len;//防止越界非法访问
ringBuff->Lenght++;
data++;
}
return RINGBUFF_OK;
}
uint8_t Write_RingBuff_One_Byte(RingBuff_t *ringBuff, uint8_t data)
{
if(ringBuff->Lenght >= ringBuff->Buff_len) //判断缓冲区是否已满
{
return RINGBUFF_ERR;
}
ringBuff->Ring_buff[ringBuff->Tail] = data;
ringBuff->Tail = (ringBuff->Tail+1) % ringBuff->Buff_len;//防止越界非法访问
ringBuff->Lenght++;
return RINGBUFF_OK;
}
/**
* @brief Read_RingBuff
* @param RingBuff_t *ringBuff,需要读取的缓冲区
* @param uint8_t *rData,用于保存读取的数据
* @param uint16_t max_len,读取数据的最大长度,防止越界
* @return 读取的数据长度
* @note 从环形缓冲区读取一个uint8_t类型的数据
*/
uint16_t Read_RingBuff(RingBuff_t *ringBuff, uint8_t *rData, uint16_t max_len)
{
uint16_t temp_len = 0;
if(ringBuff->Lenght == 0)//判断非空
{
return temp_len;
}
//sDelay_ms(1);//有时消息不回同一时间到,可以看情况选择是否等待
while(ringBuff->Lenght)
{
*rData = ringBuff->Ring_buff[ringBuff->Head];//先进先出FIFO,从缓冲区头出
ringBuff->Head = (ringBuff->Head+1)%ringBuff->Buff_len;//防止越界非法访问
ringBuff->Lenght--;
rData++;
temp_len++;
if(temp_len == max_len)
{
return temp_len;
}
}
return temp_len;
}
ring_buff.h
#ifndef __RING_BUFF_H_
#define __RING_BUFF_H_
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define RINGBUFF_OK 1
#define RINGBUFF_ERR 0
typedef struct
{
uint16_t Head;
uint16_t Tail;
uint16_t Lenght;
uint8_t *Ring_buff;
uint16_t Buff_len;
}RingBuff_t;
void RingBuff_Init(RingBuff_t *ringBuff);
uint8_t Write_RingBuff(RingBuff_t *ringBuff, uint8_t *data, uint16_t len);
uint8_t Write_RingBuff_One_Byte(RingBuff_t *ringBuff, uint8_t data);
uint16_t Read_RingBuff(RingBuff_t *ringBuff, uint8_t *rData, uint16_t max_len);
#endif