登录站点

用户名

密码

兴趣联盟 - JavaSwing

  • 分享

    C51 串行通信队列类

    3lyz 2012-08-29 22:24

    #define MAXQ 20 //队列最大数据帧个数(不可设置过大)
    #define MAXBUF 16//一帧数据缓冲区最大值

    //结构体,存储数据
    typedef struct 
    {
     uint8 name[MAXBUF];//一帧数据
     uint8 dataNum;//数据个数
    }DATA;


    typedef struct
    {
     DATA datap[MAXQ]; //列表数组
     uint8 front;
     uint8 rear;
    }Q;

    void InitQueue(Q  *q); //初始化队列
    bit  EnQueue(DATA datap,Q *q);//添加数据
    DATA DelQueue(Q *q);//取出一个值
    bit IsQEmpty(Q *q);//是否为空
    bit IsQFull(Q *q);//是否已满


    void InitQueue(Q  *q)
    {
      q->front=0;
      q->rear=0;
    }

    bit  EnQueue(DATA datap,Q *q)
    {
     q->rear=(q->rear+1)%MAXQ;
     q->datap[q->rear]=datap;
     return 1;
    }

    DATA DelQueue(Q *q)
    {
     q->front=(q->front+1)%MAXQ;
     return q->datap[q->front];
    }

    bit IsQEmpty(Q *q)
    {
     if(q->front==q->rear)return 1;
     else return 0;
    }

    bit IsQFull(Q *q)
    {
     if(((q->rear)+1)%MAXQ==(q->front))return 1;
     else return 0;
    }



    ---------------------------------使用方法----------------------------------
    Q qq;//声明
    InitQueue(&qq);//初始化 
    //添加数据到队列
     if(!IsQFull(&qq)){
      for(i = 0; i < 12; i++){
       DATA  datap;
       datap.name[0] = 0xAA;
       datap.name[1] = i;
       datap.name[2] = i;
       datap.name[3] = i;
       datap.name[4] = i;
       datap.name[5] = i;
       datap.name[6] = i;
       datap.name[7] = 0xAA;
       EnQueue(datap,&qq); //添加数据到队列
      }
     }

    //取队列数据
    DATA datap;
     if(!IsQEmpty(&qq)){
        datap = DelQueue(&qq);//从队列中取出数据
        sendBuf[0] = datap.name[0];
        sendBuf[1] = datap.name[1];
        sendBuf[2] = datap.name[2];
        sendBuf[3] = datap.name[3];
        sendBuf[4] = datap.name[4];
        sendBuf[5] = datap.name[5];
        sendBuf[6] = datap.name[6];
        sendBuf[7] = datap.name[7];
        sendCount = 8;
        beginSend();//开发传送到上位机 
       }
    注:取数据我是在定时器中每隔一定时间处理一次



你还不是该群组正式成员,不能参与讨论。 现在就加入