STM32F103 +UC/OSII+串口通信问题

2019-08-19 19:55发布

我用STM32板子,然后里面用到了UC/OSII系统,想做一个串口通信,系统有两个任务在运行,其中一个任务实现的是与PC通信,当PC发消息后,开发板接收到消息,然后把消息返回到PC,同时开启一个硬件定时器,如果超时没有接收到PC的数据则返回给PC一个“接收超时”的信息,现在问题是PC发出消息后,开发板不是每次都会返回信息,总是出现该任务重新开始运行,不在嵌套循环里了。
//LED0任务
void led0_task(void *pdata)
{                
        u16 len;
        u16 t;
        while(1)
        {
                LED0=0;
                delay_ms(80);
                LED0=1;
                printf(" 您接收的消息为: ");
                TIM_Cmd(TIM3, ENABLE);  //使能TIMx
                while((USART_RX_STA&0x8000)==0x0000)  
                {       
               if (Timer3_RTA==1)  //检查TIM3更新中断发生与否
                   {
                           Timer3_RTA=0;
                           printf(" 接收消息已超时 ");
                           TIM_Cmd(TIM3, DISABLE);  //非使能TIMx
                           break;
                   }
                   if((USART_RX_STA&0x8000)&&(Timer3_RTA==0))
                   {
                           TIM_Cmd(TIM3, DISABLE);  //非使能定时器3                          
                                len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
                                for(t=0;t<len;t++)
                                {
                                        USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
                                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
                                }
                                printf(" ");//插入换行
                                USART_RX_STA=0;         
                        break;                  
                   }
                }
                TIM3->ARR=49999;                //重新装载计数值
                USART_RX_STA=0;
                delay_ms(500);
        }
}

//LED1任务
void led1_task(void *pdata)
{          
        while(1)
        {
                LED1=0;
                delay_ms(300);
                LED1=1;
                delay_ms(300);
        }
}

PC接收到的数据:

您接收的消息为:
开源电子网:www.openedv.com

您接收的消息为:
开源电子网:www.openedv.com

您接收的消息为:
开源电子网:www.openedv.com


您接收的消息为:


您接收的消息为:


您接收的消息为:


您接收的消息为:

您接收的消息为:
开源电子网:www.openedv.com

您接收的消息为:

接收消息已超时


中间标红的信息像是led0_task被反复重启了。

求问这是咋回事啊?刚开始接触这个。
0条回答

一周热门 更多>