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
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,表示读取数据成功 |
|
} |
|
} |
|
|
|
|