|
部分代码如下:
static void thread_insert_queue(void *pvParameters)
{
BaseType_t xResult;
const TickType_t xTaskWokenByReceive =pdMS_TO_TICKS(3000); /* 设置最大等待时间为500ms */
static BaseType_t err;
static cmd_t *pcmd_t = NULL;
//struct list_head list = {0}; //定义链表(头)
//INIT_LIST_HEAD(&list); //初始化链表(头尾相接,形成空链表循环)
while(1)
{
if(GprsMessage_Queue != NULL)
{
// 队列是否满
if( uxQueueMessagesWaiting( MQTTMessage_Queue ) != 0 )
{
PRINT_DEBUG( "GUIMessage_Queue should have been empty!\r\n" );
}
//请求消息MQTTMessage_Queue
err = xQueueReceive(MQTTMessage_Queue, /* 消息队列句柄 */
(void *)&pcmd_t,//(void *)&DownMassage->cmd, /* 这里获取的是结构体的地址 */
(TickType_t)xTaskWokenByReceive); /* 设置阻塞时间 */
if(err == pdPASS) //接收到消息
{
PRINT_DEBUG("队列MQTTMessage_Queue ,数据接收OK!\r\n");
DownMassage = (message_t *)mymalloc(SRAMDTCM,sizeof(message_t));
if (NULL == DownMassage)
{
MSGPKT("mAlloc Memory For Message Queue Fail:\r\n");
goto IDLE_RUN;
}
memset(DownMassage, 0, sizeof(message_t));
MSGPKT("cmd.tcmd.type:%08X\r\n",pcmd_t->tcmd.type);//此处数据是全0
}
}
}
消息发送部分代码:
if(MQTTMessage_Queue!=NULL) { DISABLE_INT();//进入临界区 pcmd_t = cmd; ENABLE_INT();//退出临界区 PRINT_DEBUG("cmd->tcmd.type6 :%08X\r\n",pcmd_t->tcmd.type); /* 向消息队列发数据,如果消息队列满了,等待10个时钟节拍 */ err = xQueueSend(MQTTMessage_Queue, /* 消息队列句柄 */ (void *)&pcmd_t, /* 发送结构体指针变量ptMsg的地址 */ (TickType_t)10 != pdPASS); //向队列中发送数据 if(err==errQUEUE_FULL) //发送失败,即使等待了10个时钟节拍 { PRINT_DEBUG("队列MQTTMessage_Queue已满,数据发送失败!\r\n"); } PRINT_DEBUG("队列MQTTMessage_Queue ,数据发送OK!\r\n"); }
消息队列创建:
MQTTMessage_Queue=xQueueCreate(MQTT_MESSAGE_Q_NUM,sizeof(struct cmd_t *)); //创建消息GprsMessage_Queue,队列项长度是串口接收缓冲区长度 if(MQTTMessage_Queue == NULL) { /* 没有创建成功,用户可以在这里加入创建失败的处理机制 */ PRINT_ERR("创建消息队列MQTTMessage_Queue失败!"); }
现象:接收到消息但是读取出来的数据是空的
|
|