C51 串行通信隊列類

lyz 12年前發布 | 15K 次閱讀 JavaSwing

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



 本文由用戶 lyz 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!