环形缓冲区RingBuff

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



  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值