C文件:
/*************************************************************
* @brief : 环形缓冲区设计,可移植任意C平台。
* @author : 萌哒兽
* @date : 2020-07-21(更新)
* @note : 使用前调用 RingBuffInit(); 来初始化缓冲区。
*************************************************************/
#include "RingBuff.h"
static RingBuff_TypeDef ring_buff;
/*******************************************
* @brief: 初始化环形缓冲区
* @param: none
* @return: none
*******************************************/
void RingBuffInit(void)
{
ring_buff.in = 0;
ring_buff.out = 0;
ring_buff.length = 0;
}
/******************************************
* @brief: 获取缓冲区数据长度
* @return: 数据长度
******************************************/
uint16_t RingBuffGetLength(void)
{
return ring_buff.length;
}
/******************************************
* @brief: 向环形缓冲区写入一个字节
* @param: 待写入的数据(byte)
* @return: 1:写入成功 0:写入失败
******************************************/
uint8_t RingBuffWriteByte(uint8_t data)
{
if(ring_buff.length<RING_BUFF_SIZE)
{
ring_buff.buffer[ring_buff.in] = data;
ring_buff.length++;
ring_buff.in ++;
if(ring_buff.in == RING_BUFF_SIZE)
ring_buff.in = 0;
return 1;
}
return 0;
}
/******************************************
* @brief: 向环形缓冲区写入n个字节
* @param: 待写入的数据长度
* @param: 待写入的数据(byte)
* @return: 1:写入成功 0:写入失败
******************************************/
uint8_t RingBuffWriteData(uint8_t len, uint8_t *pdata)
{
if( ring_buff.length+len < RING_BUFF_SIZE )
{
ring_buff.length += len;
while (len--)
{
ring_buff.buffer[ring_buff.in] = *pdata;
ring_buff.in++;
pdata ++;
if(ring_buff.in == RING_BUFF_SIZE)
ring_buff.in = 0;
}
return 1;
}
return 0;
}
/******************************************
* @brief: 从环形缓冲区读取一个字节
* @param: 待读取数据地址
* @return: 1:成功 0:失败
******************************************/
uint8_t RingBuffReadByte(uint8_t *pdata)
{
if(ring_buff.length>0)
{
*pdata = ring_buff.buffer[ring_buff.out];
ring_buff.length--;
ring_buff.out++;
if(ring_buff.out==RING_BUFF_SIZE)
ring_buff.out = 0;
return 1;
}
return 0;
}
/******************************************
* @brief: 从环形缓冲区读取n个字节
* @param: 读取数据的长度
* @param: 读取数据地址
* @return: 1:成功 0:失败
******************************************/
uint8_t RingBuffReadData(uint8_t len, uint8_t *pdata)
{
if(ring_buff.length>=len)
{
ring_buff.length -= len;
while(len--)
{
*pdata = ring_buff.buffer[ring_buff.out];
pdata ++;
ring_buff.out ++;
if(ring_buff.out == RING_BUFF_SIZE)
ring_buff.out = 0;
}
return 1;
}
return 0;
}
/*******************************************************************
* @brief : 从缓冲缓冲区复制一个字节
* @param : 输出数据
* @return : 1:成功 0:失败
*******************************************************************/
uint8_t RingBuffCopyByte(uint8_t *pdata)
{
if(ring_buff.length>0)
{
*pdata = ring_buff.buffer[ring_buff.out];
return 1;
}
return 0;
}
/******************************************
* @brief: 从环形缓冲区复制n个字节
* @param: 复制数据的长度
* @param: 复制数据地址
* @return: 1:成功 0:失败
******************************************/
uint8_t RingBuffCopyData(uint8_t len, uint8_t *pdata)
{
uint8_t temp;
if(ring_buff.length>=len)
{
temp = ring_buff.out;
while(len--)
{
*pdata = ring_buff.buffer[temp];
pdata ++;
temp ++;
if(temp == RING_BUFF_SIZE)
temp = 0;
}
return 1;
}
return 0;
}
头文件:
#ifndef __RING_BUFF_H
#define __RING_BUFF_H
//是否支持标准库
#if 1
#include <stdint.h>
#else
typedef unsigned char uint8_t;
typedef unsigned int uint16_t;
#endif
#define RING_BUFF_SIZE 100 //缓冲区大小(0~65535),根据需要修改
typedef struct
{
uint8_t in;
uint8_t out;
uint16_t length;
uint8_t buffer[RING_BUFF_SIZE];
}RingBuff_TypeDef;
uint16_t RingBuffWriteByte(uint8_t dat);
uint8_t RingBuffWriteData(uint8_t len, uint8_t *pdata);
uint8_t RingBuffReadByte(uint8_t *dat);
uint8_t RingBuffReadData(uint8_t len, uint8_t *pdata);
uint8_t RingBuffCopyByte(uint8_t *pdata);
uint8_t RingBuffCopyData(uint8_t len, uint8_t *pdata);
#endif
本文档详细介绍了如何在C语言中实现环形缓冲区,包括相关C文件的编写和头文件的定义,旨在提供一种高效的数据存储和读取机制。
1349

被折叠的 条评论
为什么被折叠?



