Chinaunix首页 | 论坛 | 博客
  • 博客访问: 543652
  • 博文数量: 99
  • 博客积分: 5015
  • 博客等级: 大校
  • 技术积分: 1209
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-28 23:08
文章存档

2011年(7)

2010年(6)

2009年(86)

我的朋友

分类: C/C++

2009-08-03 15:50:12

在实际工作中很多时候要收发数据,于是便要用到循环缓存,下面就我常常用的通用的循环缓存做个总结,有不妥之处还请高手指点。

(1)    定义循环缓存:

#define   MAX_BUFF_LEN     1024    // 定义缓存大小

typedef struct    // 定义数据结构

{

    uint    data;

}DATA_BUFF_T;

typedef struct    // 定义缓存结构

{

    uint    readPos;

    uint    writePos;

    DATA_BUFF_T    DATA[MAX_BUFF_LEN];

}DATAS_BUFF_T;

static DATAS_BUFF_T   Buff0;    // 定义缓存

(2)初始化循环缓存:

Buff0.readPos = 0;

Buff0.writePos = 0;

(3)判断缓存中是否有数据:

BOOL HaveData_Buff(void)

{

    if (Buff0.readPos != Buff0.write.Pos)

    {

        return 1;

    }

    else

    {

        return 0;

    }

}

(4)向缓存中写数据:

int WriteData(uint data)

{

    uint    nextPos;

    nextPos = (Buff0.writePos + 1) % MAX_BUFF_LEN;

    if (nectPos != Buff0.readPos)    // 判断缓存是否满,需要写入数据的位置等于读数据的位置时

    {

        Buff0.DATA[writePos].data = data;

        Buff0.writePos = nextPos;

        return 0;    //成功

    }

    else

    {

        return -1;

    }

}

(5)从缓存中读数据:

uint ReadData(void)

{

    uint dataTemp;

    if (HaveData_Buff() == 0)

    {

        printf("buffer is empty\n");

        return -1;

    }

    dataTemp = Buff0.DATA[readPos].data;

    Buff0.readPos = (Buff0.readPos + 1) % MAX_BUFF_LEN;

    return dataTemp;

}


这是我学习工作过程中的记录和整理,如有错误和不托之处还请大师留言指点,学生在此先行谢过了!!!

阅读(6459) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-03-28 13:50:45

readPos和writePos的含义是啥?write操作会先writePos++,但read时是直接readPos,如果先write data,then read,岂不是read出来的是未初始化的数据?(在第一次write的时候,比如readPos=writePos=0, write, writePos=1, read Buff0[0].data??)