最近在做一款lorawan网关产品时,需要用到消息队列,就按自己的思路写了一套函数,实现比较简单轻量,程序猿一看便能理解,现在贴出来给做做开发的朋友分享。技术讨论,欢迎加QQ技术群
#defineADV_DATA_DEPTH16#defineADV_DATA_LENGTH_MAX65
//结构体声明typedefstruct{U8ucHeadPtr;//头指针U8 ucTailPtr; //尾指针U8ucAdvData[ADV_DATA_DEPTH][ADV_DATA_LENGTH_MAX];}ADV_DATA_LIST;
ADV_DATA_LISTstAdvDataList;
//清消息队列voidAdv_Data_Clear(void){stAdvDataList.ucHeadPtr=stAdvDataList.ucTailPtr=0;}
//获取队列长度U8Adv_Data_GetLength(){U8ucLen=0;if((stAdvDataList.ucHeadPtr=ADV_DATA_DEPTH)
(stAdvDataList.ucTailPtr=ADV_DATA_DEPTH))Adv_Data_Clear();if(stAdvDataList.ucTailPtr=stAdvDataList.ucHeadPtr)ucLen=stAdvDataList.ucTailPtr-stAdvDataList.ucHeadPtr;elseucLen=stAdvDataList.ucTailPtr+ADV_DATA_DEPTH-stAdvDataList.ucHeadPtr;returnucLen;}
//往队列里添加消息U8Adv_Data_Fill(U8*buf,U8length){U8ucLen=0;ucLen=Adv_Data_GetLength();if(ucLen=ADV_DATA_DEPTH-1) //满{return0;}if(length(ADV_DATA_LENGTH_MAX-1))length=(ADV_DATA_LENGTH_MAX-1);stAdvDataList.ucAdvData[stAdvDataList.ucTailPtr][0]=length;for(ucLen=0;ucLenlength;ucLen++)stAdvDataList.ucAdvData[stAdvDataList.ucTailPtr][1+ucLen]=buf[ucLen];
stAdvDataList.ucTailPtr++;if(stAdvDataList.ucTailPtr=ADV_DATA_DEPTH)stAdvDataList.ucTailPtr=0;
return1;}
//从队列获取消息U8Adv_Data_Get(U8*buf,U8*length){U8ucLen=0,temp8;ucLen=Adv_Data_GetLength();if(ucLen==0) //空{return0;}*length=stAdvDataList.ucAdvData[stAdvDataList.ucHeadPtr][0];ucLen=*length;for(temp8=0;temp8ucLen;temp8++)buf[temp8]=stAdvDataList.ucAdvData[stAdvDataList.ucHeadPtr][1+temp8];stAdvDataList.ucHeadPtr++;if(stAdvDataList.ucHeadPtr=ADV_DATA_DEPTH)stAdvDataList.ucHeadPtr=0;return1;}
//使用方法voidmain(void){Adv_Data_Clear();while(1){Adv_Data_Fill(…);…Adv_Data_Get(…);}}
专注物联网相关领域研究与开发,分享热门物联网技术研究心得,如MESH自组网技术,LORA/LORAWAN组网技术。希望通过这个平台结识这个领域的支持朋友,共同成长。欢迎加QQ技术群,在线交流。