蓝牙技术学习
直播中

丁欣如

7年用户 187经验值
私信 关注
[问答]

蓝牙接受数据部分代码,是使用usart2中断来实时的接收数据吗?

我使用的是ALIENTEK的蓝牙通信模块,应用中我定义一个全局变量,然后在usart2的接收中断中把收到的第一个字符
赋值给全局变量tt,代码如下,其他部分代码不改动。
void USART2_IRQHandler(void){u8 res;    if(USART2->SR&(1<<5))//接收到数据{ res=USART2->DR;  if(USART2_RX_STAtiM4->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循环?
麻烦,发烧友给看看,我也把整体工程上传了,如果是别的问题也请指出。谢谢
robot.rar (1.13 MB )

回帖(5)

李腈

2019-1-16 09:55:51
在if(USART2_RX_STA&0X8000)里面,添加printf,打印出你的tt值,看一下。
举报

乔丽娜

2019-1-16 10:12:18
已经测试,在while循环里面tt值就是进入while的值不改变。我安卓软件是按键使用onTouch,摁下的时候发送一个字符做命令,弹起的时候发送另一个字符,如果用if可以看到摁下和弹起显示两个不同的字符,但是while则只能卡死在摁下的字符,tt的值不会改变。
举报

曹珉

2019-1-16 10:19:02
USART2_RX_STA=0;放在while之前。
举报

李梅

2019-1-16 10:36:04
实际测试USART2_RX_STA=0;放在while之前确实可以一定程度上解决问题,但是还是经常会有卡死挨while循环的情况。于是在每个while里面都加上USART2_RX_STA=0,这下再也没有出现卡死的情况。
我想问一下,USART2_RX_STA=0,这个全局变量是怎样影响程序执行的?因为蓝牙中断void USART2_IRQHandler(void)
{
u8 res;    
if(USART2->SR&(1<<5))//??????????

res=USART2->DR;  
if(USART2_RX_STA {
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]; 
}   
}
这个函数里面的if函数的条件似乎每次都能得到满足,不是吗?为什么USART2_RX_STA=0可以使程序卡死?  麻烦原子哥给解释一下,谢谢。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分