C语言实现一个fifo数组读写,长度可变

最近做一个小项目,要做一个简单的FIFO,网上找到了一个轮子,但是,只能对单个数进行读写,就把轮子改造了一下。
#include "para.h"

RingBuff_t ringBuff;
void RingBuff_Init(void) //初始化函数
{
    ringBuff.Head = 0; //头指针置于起始位
    ringBuff.Tail = 0; //尾指针置于起始位
    ringBuff.Lenght = 0; //计录当前数据长度 判断是否存有数据
}


uint8_t Write_RingBuff(uint8_t data) //存入指定的缓冲数组并通过数据长度判断是否溢出 返回值0正常 1溢出
{
    if(ringBuff.Lenght >=ringBuff_total_Length ) //200是申请的内存长度 可以修改 如果超过则为溢出
    {
        return 1; //确认数据溢出返回值1
    }
    ringBuff.Ring_Buff[ringBuff.Tail] = data; //将数据通过尾指针指向的地址存入Ring_Buff缓冲数组中
    ringBuff.Tail = (ringBuff.Tail + 1) % ringBuff_total_Length; //构建尾部指针的循环 指针累加 指针地址超过199 则重新置于0
    ringBuff.Lenght++;  //记录存入数据的长度 判断数据的存有数量和溢出情况
    return 0; //无溢出情况存入数据 返回值0
}


uint8_t Read_RingBuff(uint8_t *rData) //从指定的缓冲数组中读出头指针指向地址的数据
{
    if(ringBuff.Lenght == 0) //如果数据长度为0 则此时缓冲数组中未存有数据
    {
        return 1; //取出数据失败 返回值0
    }
    *rData = ringBuff.Ring_Buff[ringBuff.Head]; //在Ring_buff中从头指针指向的地址中取出数据
    ringBuff.Head = (ringBuff.Head + 1) % ringBuff_total_Length; //构建头部指针的循环 指针累加 指针地址超过199 则重新置于0
    ringBuff.Lenght--; //取出数据时减去相应的数据长度
    return 0; //取出数据正常 返回值0
}


uint8_t Write_RingBuff_Alex(uint8_t *data,uint16_t Length) //
{
    u16 l_count=0;
    u8 L_Reslut=0;
    for(l_count=0;l_count<Length;l_count++)
    {
        L_Reslut= Write_RingBuff(*data+l_count);
        if(L_Reslut==1)
        {
            return 1;
        }
    }
    return 0;
}


uint8_t Read_RingBuff_Alex(uint8_t *rData,uint16_t Length)
{
    u16 l_count1=0;
    u8 L_Reslut1=0;
    for(l_count1=0;l_count1<Length;l_count1++)
    {
        L_Reslut1= Read_RingBuff(&(rData[0+l_count1]));
        if(L_Reslut1==1)
        {
            return 1;
        }
    }
    return 0;
}

///

#ifndef __PARA_H
#define __PARA_H
#include "sys.h"

	
#define ringBuff_total_Length   3
typedef struct
{
 uint16_t Head;//头指针 取出数据时移动头指针
 uint16_t Tail;//尾指针 存入数据时移动尾指针
 uint16_t Lenght;//长度  尾指针和头指针间的距离 代表存储数据的长度
 uint8_t Ring_Buff[ringBuff_total_Length];//缓冲大小 申请了200长度的数组用于存取数据
}RingBuff_t;
extern RingBuff_t ringBuff;

void RingBuff_Init(void);//缓冲区初始化
uint8_t Write_RingBuff(uint8_t data);//入队
uint8_t Read_RingBuff(uint8_t *rData);//出队
uint8_t Write_RingBuff_Alex(uint8_t *data,uint16_t Length); //写入指定长度
uint8_t Read_RingBuff_Alex(uint8_t *rData,uint16_t Length); //读出指定程度

		 




#endif
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值