1. c文件
#defineDEF_MSG_QUEUE_MODULE/********************************************************************************* * INCLUDES *********************************************************************************/#include"msg_queue.h"#include<string.h>/********************************************************************************* * DEFINES *********************************************************************************//********************************************************************************* * MACROS *********************************************************************************//********************************************************************************* * TYPEDEFS *********************************************************************************/staticMsg_t msg_q[MSG_QUEUE_LEN];staticuint16_tmsgPackId=1;/********************************************************************************* * STATIC FUNCTION *********************************************************************************//********************************************************************************* * GLOBAL FUNCTION *********************************************************************************//*初始化*/voidinitMsg(void){//初始化变量memset(msg_q,0,sizeof(msg_q));msgPackId=1;//启动定时器}/*向消息队列中插入消息*/voidinsertMsg(uint8_t*msg,uint16_tlen,uint8_tqos){for(inti=0;i<MSG_QUEUE_LEN;i++){if(msg_q[i].isEnable){strncpy(msg_q[i].msg,msg,len);msg_q[i].isEnable=1;msg_q[i].msgLen=len;msg_q[i].packId=msgPackId;msg_q[i].sendCount=0;msg_q[i].timer=0;msg_q[i].qos=qos;msgPackId++;if(msgPackId>65530){msgPackId=1;}return;}}}/*从消息队列中移除消息, 收到回复则移除 */voidremoveMsg(uint8_tpackId){for(inti=0;i<MSG_QUEUE_LEN;i++){if(packId==msg_q[i].packId){msg_q[i].isEnable=0;}}}/*轮询处理, 在1s轮询或定时器中调用*/voidloopMsg(void){//计时for(inti=0;i<MSG_QUEUE_LEN;i++){if(msg_q[i].isEnable){msg_q[i].timer++;}}//重发消息for(inti=0;i<MSG_QUEUE_LEN;i++){if(msg_q[i].isEnable){if(msg_q[i].timer>3){uart_send(msg_q[i].msg,msg_q[i].msgLen);msg_q[i].timer=0;msg_q[i].sendCount++;}}}//移除重发次数超限的消息for(inti=0;i<MSG_QUEUE_LEN;i++){if(msg_q[i].isEnable){if(msg_q[i].sendCount>3){msg_q[i].isEnable=0;}}}}2. h文件
#ifndef__MSG_QUEUE_H__#define__MSG_QUEUE_H__/********************************************************************************* * INCLUDES *********************************************************************************//********************************************************************************* * DEFINES *********************************************************************************/#ifdefDEF_MSG_QUEUE_MODULE#defineDEF_MSG_QUEUE_MODULE#else#defineDEF_MSG_QUEUE_MODULEextern#endiftypedefunsignedcharuint8_t;typedefunsignedshortuint16_t;typedefunsignedlonguint32_t;typedefsignedcharint8_t;typedefsignedshortint16_t;typedefsignedlongint32_t;/********************************************************************************* * MACROS *********************************************************************************/#defineMSG_QUEUE_LEN10/********************************************************************************* * TYPEDEFS *********************************************************************************/typedefstruct{uint8_tmsg[350];//消息实体uint16_tmsgLen;//消息实体的长度uint16_tpackId;//发送的包iduint8_tsendCount;//重复次数uint8_ttimer;//重发间隔时间uint8_tqos;//消息质量uint8_tisEnable;//是否有效}Msg_t;/********************************************************************************* * GLOBAL FUNCTION *********************************************************************************/voidinitMsg(void);voidinsertMsg(uint8_t*msg,uint16_tlen);voidremoveMsg(uint8_tpackId);voidloopMsg(void);#endif/* __MSG_QUEUE_H__ */