环形缓冲区

发布时间 2023-06-02 17:28:09作者: 只因在风中
typedef struct
{
   struct HORN *Buffer; //缓冲区
   unsigned int  pw; //写地址
   unsigned int  pr; //读地址
}RingBuffer_t,*pRingBuffer_t;

static RingBuffer_t RingBuffer;

/**
 @brief  写一个字节
 @param  wdata:写入的一个字节数据
 @retval 1:环形缓冲区满 0:环形缓冲区未满
**/
uint8_t RingBuffer_Write_One_Byte(pRingBuffer_t pRingBuffer,const struct HORN wdata)
{
    if((pRingBuffer->pw + 1)%BUFF_SIZE==pRingBuffer->pr)//环形缓冲区满
    {
      return 1;
    }else //环形缓冲区未满
    {
       pRingBuffer->Buffer[pRingBuffer->pw] = wdata;
       pRingBuffer->pw=(pRingBuffer->pw+1)%BUFF_SIZE;
       return 0;
    }
}
/**
 @brief  读一个字节数据
 @param  rdata:保存读出的数据 
 @retval 1:已读出全部数据 0:仍有未读出的数据
**/
uint8_t RingBuffer_Read_One_Byte(pRingBuffer_t pRingBuffer,struct HORN *rdata)
{
    if(pRingBuffer->pr==pRingBuffer->pw)//已读出全部数据
    {
        return 1;
    }else//仍有未读出的数据
    {
        *rdata=pRingBuffer->Buffer[pRingBuffer->pr];
        pRingBuffer->pr=(pRingBuffer->pr+1)%BUFF_SIZE;
        return 0;
    }
}
//环形缓冲区buff初始化
void ring_buff_init(void)
{
    RingBuffer.Buffer = horn_data;
    RingBuffer.pw = 0;
    RingBuffer.pr = 0;
}
//环形缓冲区添加数据
void ring_buff_add_data(unsigned char voide,unsigned char vol)
{
    struct HORN wdata;
    wdata.voide = voide;
    wdata.vol = vol;
    RingBuffer_Write_One_Byte(&RingBuffer,wdata);
}