求助 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);   
                 }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
其实很简单
1楼-- · 2019-12-20 22:39
找到问题了,是队列定义的问题,但是还不理解。
将队列定义改为         
uint8_t u8Send_buff[20],cnt;
   u2QueueRx=xQueueCreate(5,sizeof(u8Send_buff));        //创建消息队,列深度为5
上面的队列定义含义是:队列深度为5的长度为20的队列。
1)这个队列深度的作用是什么意思
2)是不是所有队列默认的都是队列里的每一个元素都是8bit的,如果想传输16bit的数据怎么办
yyliu
2楼-- · 2019-12-21 04:00
uint16_t u16Send_buff[20],cnt;
   u2QueueRx=xQueueCreate(5,sizeof(u16Send_buff));        //创建消息队,列深度为5
yinjinzhong
3楼-- · 2019-12-21 06:26
 精彩回答 2  元偷偷看……
lusson
4楼-- · 2019-12-21 11:02
你可以看成一个二维数组,比如你定义的5和20,你可以看成你定义了个数组temp[5][20]
深度为5,大小为20
你这边每次Push相当于push进去了20个字节,深度减1
接收方每次接收到对应的20个字节,收完后深度加1

如此反复。。。
其实很简单
5楼-- · 2019-12-21 15:37
lusson 发表于 2018-3-28 17:05
你可以看成一个二维数组,比如你定义的5和20,你可以看成你定义了个数组temp[5][20]
深度为5,大小为20
你 ...

谢谢解答
limaotaizi
6楼-- · 2019-12-21 16:10
搭个便车学习下!~

一周热门 更多>