我使用的是ALIENTEK的蓝牙通信模块,应用中我定义一个全局变量,然后在usart2的接收中断中把收到的第一个字符
赋值给全局变量tt,代码如下,其他部分代码不改动。
void USART2_IRQHandler(void){
u8 res;
if(USART2->SR&(1<<5))//接收到数据
{
res=USART2->DR;
if(USART2_RX_STA<USART2_MAX_RECV_LEN) //还可以接收数据
{
TIM4->CNT=0; //计数器清空
if(USART2_RX_STA==0)TIM4_Set(1); //使能定时器4的中断
USART2_RX_BUF[USART2_RX_STA++]=res; //记录接收到的值
}else
{
USART2_RX_STA|=1<<15; //强制标记接收完成
}
tt=(char)USART2_RX_BUF[0];
}
}
main()函数中while(1)
{
if(USART2_RX_STA&0X8000) //????????????????
{
// LCD_Fill(30,200,240,320,WHITE); //????????
reclen=USART2_RX_STA&0X7FFF; //?????????¤??
USART2_RX_BUF[reclen]=0; //?????á??·?
// LCD_ShowString(30,200,209,119,16,USART2_RX_BUF);//????????????????
// LCD_ShowChar(30,220,USART2_RX_BUF[0],16,1);
while(tt=='8') //????
{
// distance=440;
distance-=20;
if(distance<=200)distance=200;
SetMode(7,0,1023);
delay_ms(30);
PawGoFar(distance);
delay_ms(50);
LED1=0;
if(tt=='0')break;
}
USART2_RX_STA=0;
}
}
while(1)里面的小while循环不会跳出,我的手机端在一直在给蓝牙发送命令,所以蓝牙一直在收到命令,理论上应该tt的值在变能够跳出while(tt=='8')这个循环,
但是实际发现不会跳出,如果把while循环改为if则能正常工作。
我的问题是,蓝牙接受数据部分代码,是使用usart2中断来实时的接收数据吗? 如果是的话我在中断处理程序中赋值全局变量为什么不能跳出while循环?
麻烦,正点原子给看看,我也把整体工程上传了,如果是别的问题也请指出。谢谢 |