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