我用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被反复重启了。
求问这是咋回事啊?刚开始接触这个。
一周热门 更多>