You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

65 lines
2.2 KiB

/**********************************************************************************************
描述 : 环形缓冲区读写
作者 :
版本 :V1.0
修改 :
完成日期 :
Notice :
***********************************************************************************************/
#include "ringbuffer.h"
#include <stdio.h>
void RingBuf_Init(RingBuffer_T *pbuf)
{
pbuf->headPos = 0;
pbuf->tailPos = 0;
}
/**
* @brief 写一个字节到环形缓冲区
* @param data:待写入的数据
* @return none
*/
void RingBuf_Write(RingBuffer_T *pbuf, unsigned char data)
{
//printf("%02X", data);
// 将数据存放到tailPos所指向的元素空间
pbuf->ringBuf[pbuf->tailPos] = data; //从尾部追加
// tailPosition变量自增1,并且判断,如果大于最大缓冲,则将tailPos归零
if(++(pbuf->tailPos) >= BUFFER_MAX) {//尾节点偏移
pbuf->tailPos=0; //大于数组最大长度 归零 形成环形队列
}
// 如果tailPos与headPos相等,则表示,数据存入速度大于数据取出速度,从到导致“追尾”。
if(pbuf->tailPos == pbuf->headPos) {//如果尾部节点追到头部节点,则修改头节点偏移位置丢弃早期数据
// 此时headPos需要自增1,以丢弃早期数据,这也就是数据“覆盖现象”,这种现象是不允许存在的,解决这种现象的办法是将缓冲队列的空间再开大点。
if(++(pbuf->headPos) >= BUFFER_MAX) {
// 如果headPos也大于最大数组,则需要将headPos清零。
pbuf->headPos=0;
}
}
}
/**
* @brief 读取环形缓冲区的一个字节的数据
* @param *pData:指针,用于保存读取到的数据
* @return 1表示缓冲区是空的,0表示读取数据成功
*/
uint8_t RingBuf_Read(RingBuffer_T *pbuf, unsigned char* pData)
{
// 首先判断headPos是否等于tailPos,如果相等,则表明,此时缓冲区是空的。
if(pbuf->headPos == pbuf->tailPos) {//如果头尾接触表示缓冲区为空
return 1; //返回1,环形缓冲区是空的
}
// 如果缓冲区不为空,则条件成立并执行
else {
// 读取headPos所指向的环形缓冲队列的元素空间的数据。
*pData = pbuf->ringBuf[pbuf->headPos]; //如果缓冲区非空则取头节点值并偏移头节点
// headPosition自增1以读取下一个数据。如果headPos大于最大值BUFFER_MAX,则将headPosition归零。
if(++(pbuf->headPos) >= BUFFER_MAX) {
pbuf->headPos = 0;
}
//printf("<%d %d>", pbuf->headPos, pbuf->tailPos);
return 0; //返回0,表示读取数据成功
}
}