求助 FREERTOS 串口中断中使用消息队列传数,只能接收单字节

2019-12-20 21:37发布

本帖最后由 其实很简单 于 2018-3-28 15:28 编辑

通过串口2,用定时器2作为超时定时器,超时以后默认为一帧完整数据接收完成。
在任务函数里将接收到数据在通过串口2发送。
现象是每次发送是个字节,单只能接收到第一个字节:例如发送 11 22 33 44 55 66 77 88 99 00 ,串口助手接收到数据为 11 00 00 00 00 00 00 00 00 00
究竟是哪里出问题了呢?
下面是代码
void vTaskStart(void)
{


       
                    xTaskCreate( vTaskLED,           /* 任务函数  */
                    "vTaskLED",             /* 任务名    */
                    512,                       /* 任务栈大小,单位word,也就是4字节 */
                    NULL,                      /* 任务参数  */
                    1,                         /* 任务优先级*/
                    &xHandleTaskLED );  /* 任务句柄  */

//                    xTaskCreate( vTaskDO,           /* 任务函数  */
//                    "vTaskDO",             /* 任务名    */
//                    512,                       /* 任务栈大小,单位word,也就是4字节 */
//                    NULL,                      /* 任务参数  */
//                    2,                         /* 任务优先级*/
//                    &xHandleTaskDO );  /* 任务句柄  */
       
                    xTaskCreate( vTaskAndroid,           /* 任务函数  */
                    "vTaskAndroid",             /* 任务名    */
                    512,                       /* 任务栈大小,单位word,也就是4字节 */
                    NULL,                      /* 任务参数  */
                    2,                         /* 任务优先级*/
                    &xHandleTaskANDROID );  /* 任务句柄  */             
               
             
}

QueueHandle_t u2QueueRx;        //信息队列句柄
void vTaskAndroid(void *pvParameters)
{
         uint8_t u8Send_buff[20],cnt;
   u2QueueRx=xQueueCreate(50,sizeof(u8));        //创建消息队,列深度为50
         while(1)
                 {
                         /*wait time:0,portMAX_DELAY*/
                         if(xQueueReceive(u2QueueRx,&u8Send_buff,10/portTICK_RATE_MS)==pdTRUE)
                         {
                           bsp_UART2_Send_Data(u8Send_buff,10);
                                 for(cnt=0;cnt<20;cnt++)
                                  {
                                        u8Send_buff[cnt]=0;
                                        }
                         }
                          
                         /* vTaskDelayUntil是绝对延迟,vTaskDelay是相对延迟。*/
                                                 vTaskDelay(100);   
                 }
}

extern u8 time2;
void TIM2_IRQHandler(void)  
{
        BaseType_t xResult;
        BaseType_t xHigherPriorityTaskWoken = pdFALSE;
       
  if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
        {
         TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );

                  STOP_TIME2();
                        xQueueSendFromISR(u2QueueRx, (void *)&UART2_STATU.RX_BUF, &xHigherPriorityTaskWoken);/*接收完成把数据通过消息队列发送(void *)&ptMsg,*/
                        uart2_clear();
                        portYIELD_FROM_ISR( xHigherPriorityTaskWoken );

         
        }
}


void USART2_IRQHandler(void)                       
{
         if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
                 {
                   USART_ClearFlag(USART2,USART_FLAG_RXNE);
                         START_TIME2();
                   if(UART2_STATU.Index==0) time2=0;                                       
                         if(UART2_STATU.Index<100)
                         {
                                 time2=0;
                           UART2_STATU.RX_BUF[UART2_STATU.Index++]=USART_ReceiveData(USART2);
                         }
                         else UART2_STATU.Index=0;
                 }
//溢出-如果发生溢出需要先读SR,再读DR寄存器则可清除不断入中断的问题[牛人说要这样]
//  if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET)
//    {
//      USART_ClearFlag(USART2,USART_FLAG_ORE);
//    }
}

void vTaskAndroid(void *pvParameters)
{
         uint8_t u8Send_buff[20],cnt;
   u2QueueRx=xQueueCreate(50,sizeof(u8));        //创建消息队,列深度为50
         while(1)
                 {
                         /*wait time:0,portMAX_DELAY*/
                         if(xQueueReceive(u2QueueRx,&u8Send_buff,0/portTICK_RATE_MS)==pdTRUE)
                         {
                           bsp_UART2_Send_Data(u8Send_buff,10);
                                 for(cnt=0;cnt<20;cnt++)
                                  {
                                        u8Send_buff[cnt]=0;
                                        }
                         }
                          
                         /* vTaskDelayUntil是绝对延迟,vTaskDelay是相对延迟。*/
                                                 vTaskDelay(100);   
                 }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。