C51 串行通信队列类

6年前

#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();//开发传送到上位机 
   }
注:取数据我是在定时器中每隔一定时间处理一次