头文件:ring_buffer.h
#ifndef __RING_BUFFER_H__
#define __RING_BUFFER_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <assert.h>
#define RING_BUFFER_DEGUG 1
typedef struct
{
uint16_t read_ofs;
uint16_t write_ofs;
uint16_t len;
uint16_t max;
uint8_t *buffer;
} RingBuffer;
void InitRingBuff(RingBuffer *p_ring, uint8_t *buffer, uint32_t max_len);
int ReadRingBuff(RingBuffer *p_ring, uint8_t *pBuff, int len);
int WriteRingBuff(RingBuffer *p_ring, uint8_t *pBuff, int AddLen);
uint8_t read_u8_from_index(RingBuffer *p_ring, uint16_t index);
uint16_t get_count(RingBuffer *p_ring);
uint16_t read_data_ofs(RingBuffer *p_ring, uint8_t *data, const uint16_t len, const uint16_t offset);
uint16_t remove_data(RingBuffer *p_ring, uint16_t remove_len);
uint16_t ring_clean(RingBuffer *p_ring);
#endif
源文件:ring_buffer.c
#include "ring_buffer.h"
void InitRingBuff(RingBuffer *p_ring, uint8_t *buffer,uint32_t max_len)
{
p_ring->buffer = buffer;
memset(p_ring->buffer, 0, max_len);
p_ring->read_ofs = 0;
p_ring->write_ofs = 0;
p_ring->len = 0;
p_ring->max = max_len;
}
int WriteRingBuff(RingBuffer *p_ring, uint8_t *pBuff, int AddLen)
{
if (p_ring->buffer == NULL)
{
#if RING_BUFFER_DEGUG>1
printf("%s %d WriteRingBuff:RingBuff is not Init!\r\n",__FILE__,__LINE__);
#endif
return 0;
}
if (AddLen >= p_ring->max - p_ring->len)
{
AddLen = p_ring->max - p_ring->len;
#if RING_BUFFER_DEGUG>1
printf("%s %d kong jian bu zu %d\r\n",__FILE__,__LINE__, AddLen);
#endif
}
for (uint16_t i = 0; i < AddLen; i++)
{
p_ring->buffer[p_ring->write_ofs] = pBuff[i];
p_ring->write_ofs = (++p_ring->write_ofs) % p_ring->max;
}
p_ring->len += AddLen;
#if RING_BUFFER_DEGUG>2
printf("%s %d write : ",__FILE__,__LINE__);
for (uint16_t i = 0; i < p_ring->max; i++)
{
printf("%02x ", p_ring->buffer[i]);
}
printf("\r\n ");
printf("read = %d write = %d len = %d\n", p_ring->read_ofs, p_ring->write_ofs, p_ring->len);
#endif
return AddLen;
}
int ReadRingBuff(RingBuffer *p_ring, uint8_t *pBuff, int read_len)
{
if (p_ring->buffer == NULL)
{
#if RING_BUFFER_DEGUG>1
printf("%s %d don't init RingBuffer\r\n",__FILE__,__LINE__);
#endif
return 0;
}
if (read_len > p_ring->len)
{
read_len = p_ring->len;
#if RING_BUFFER_DEGUG>1
printf("%s %d read data only \r\n",__FILE__,__LINE__);
#endif
}
for (uint16_t i = 0; i < read_len; i++)
{
pBuff[i] = p_ring->buffer[p_ring->read_ofs];
p_ring->read_ofs = (++p_ring->read_ofs) % p_ring->max;
}
p_ring->len -= read_len;
#if RING_BUFFER_DEGUG>2
printf("%s %d read : ",__FILE__,__LINE__);
for (uint16_t i = 0; i < read_len; i++)
{
printf("%02x ", pBuff[i]);
}
printf("\r\n ");
printf("read = %d write = %d len = %d\n", p_ring->read_ofs, p_ring->write_ofs, p_ring->len);
#endif
return read_len;
}
uint16_t get_count(RingBuffer *p_ring)
{
return p_ring->len;
}
uint8_t read_u8_from_index(RingBuffer *p_ring, uint16_t index)
{
uint16_t real_index = 0;
if (index > p_ring->len - 1)
{
#if RING_BUFFER_DEGUG>1
printf("%s %d index error\r\n",__FILE__,__LINE__);
#endif
}
real_index = (p_ring->read_ofs + index) % p_ring->max;
return p_ring->buffer[real_index];
}
uint16_t read_data_ofs(RingBuffer *p_ring, uint8_t *data, const uint16_t len, const uint16_t offset)
{
if ((len + offset) > p_ring->len)
{
#if RING_BUFFER_DEGUG>1
printf("%s %d get data fail...\r\n", __FILE__, __LINE__);
#endif
}
p_ring->read_ofs +=offset;
for (uint32_t i = 0; i < len; i++)
{
data[i]= p_ring->buffer[p_ring->read_ofs];
p_ring->read_ofs = (++p_ring->read_ofs)%p_ring->max;
}
p_ring->len -= (len+offset);
#if RING_BUFFER_DEGUG>2
printf("%s %d read = %d write = %d len = %d\r\n", __FILE__, __LINE__, p_ring->read_ofs, p_ring->write_ofs, p_ring->len);
#endif
return len;
}
uint16_t remove_data(RingBuffer *p_ring,uint16_t remove_len)
{
if(remove_len >p_ring->len )
{
#if RING_BUFFER_DEGUG>1
printf("%s %d param error \r\n",__FILE__,__LINE__);
#endif
return 0;
}
p_ring->read_ofs= (p_ring->read_ofs+remove_len)%p_ring->max;
p_ring->len-=remove_len;
#if RING_BUFFER_DEGUG>2
printf("%s %d remove later : ",__FILE__,__LINE__);
for (uint16_t i = 0; i < p_ring->max; i++)
{
printf("%02x ", p_ring->buffer[i]);
}
printf("\r\n ");
printf("read = %d write = %d len = %d\r\n", p_ring->read_ofs, p_ring->write_ofs, p_ring->len);
#endif
return remove_len;
}
uint16_t ring_clean(RingBuffer *p_ring)
{
if(p_ring!=NULL)
{
p_ring->len=0;
p_ring->read_ofs=0;
p_ring->write_ofs=0;
}
return 1;
}