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();//開發傳送到上位機
}
注:取數據我是在定時器中每隔一定時間處理一次