/********************************************************************************************** 描述 : 环形缓冲区读写 作者 : 版本 :V1.0 修改 : 完成日期 : Notice : ***********************************************************************************************/ #include "ringbuffer.h" #include 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,表示读取数据成功 } }