#define ADV_DATA_DEPTH 10 //10帧数据深度
#define ADV_DATA_LENGTH_MAX 128 //每帧数据最大长度为128字节
//结构体声明
typedef struct{
U8 ucHeadPtr; //头指针
U8 ucTailPtr; //尾指针
U8 ucAdvData[ADV_DATA_DEPTH][ADV_DATA_LENGTH_MAX];
}ADV_DATA_LIST;
ADV_DATA_LIST stAdvDataList;
//清消息队列
void Adv_Data_Clear(void)
{
stAdvDataList.ucHeadPtr = stAdvDataList.ucTailPtr =0;
}
//获取队列长度
U8 Adv_Data_GetLength()
{
U8 ucLen = 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;
else //否则若头位置大于尾位置 则表明数据二次写入 头指针靠近消息队列出口 尾指针靠近消息队列入口 长度取(尾位置 + 数组深度 - 头位置)
ucLen = stAdvDataList.ucTailPtr + ADV_DATA_DEPTH - stAdvDataList.ucHeadPtr;
return ucLen;
}
//往队列里添加消息 返回0表示队列信息已满 无法再存储
U8 Adv_Data_Fill(U8 *buf,U8 length) //buf为消息内容 length为消息长度
{
U8 ucLen = 0;
ucLen = Adv_Data_GetLength();
if(ucLen >= ADV_DATA_DEPTH-1) //消息队列已满
return 0;
if(length>(ADV_DATA_LENGTH_MAX-1)) //存入数据过长 则只存入数组最大长度
length=(ADV_DATA_LENGTH_MAX-1);
stAdvDataList.ucAdvData[stAdvDataList.ucTailPtr][0] = length; //转存时 每帧数据第一个字节用于存储数据长度信息
for(ucLen=0;ucLen<length;ucLen++)
stAdvDataList.ucAdvData[stAdvDataList.ucTailPtr][1+ucLen] = buf[ucLen];
stAdvDataList.ucTailPtr++; //尾指针位置下移 表示数据多了一帧
if(stAdvDataList.ucTailPtr >= ADV_DATA_DEPTH) //若尾指针位置超出队列长度 则重新置零
stAdvDataList.ucTailPtr = 0;
return 1;
}
//从队列获取消息 返回0表示队列信息已空 无法再读取
U8 Adv_Data_Get(U8 *buf,U8 *length)
{
U8 ucLen = 0,temp8;
ucLen = Adv_Data_GetLength();
if(ucLen == 0) //空
return 0;
*length = stAdvDataList.ucAdvData[stAdvDataList.ucHeadPtr][0]; //获取此帧数据的长度信息
ucLen=*length;
for(temp8=0;temp8<ucLen;temp8++)
buf[temp8]=stAdvDataList.ucAdvData[stAdvDataList.ucHeadPtr][1+temp8];
stAdvDataList.ucHeadPtr++; //头指针位置下移 表示数据少了一帧
if(stAdvDataList.ucHeadPtr >= ADV_DATA_DEPTH) //若头指针位置超出队列长度 则重新置零
stAdvDataList.ucHeadPtr = 0;
return 1;
}
//使用方法
void main(void)
{
Adv_Data_Clear();
while(1) {
Adv_Data_Fill(…);
…
Adv_Data_Get(…);
}
}
简单的消息队列(C语言实现)
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 使用JAVA语言自己动手来写一个MQ (类似ActiveMQ,RabbitMQ) 主要角色 首先我们必须需要搞明白...
- NSQ是实时的分布式消息处理平台,其设计的目的是用来大规模地处理每天数以十亿计级别的消息。它具有分布式和去中心化拓...
- 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心...