OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9775|回复: 5

蓝牙模块使用中的问题

[复制链接]

3

主题

14

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-4-28
在线时间
1 小时
发表于 2013-5-4 20:32:29 | 显示全部楼层 |阅读模式
我使用的是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循环?
麻烦,正点原子给看看,我也把整体工程上传了,如果是别的问题也请指出。谢谢

robot.rar

1.13 MB, 下载次数: 1206

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-5-4 20:49:55 | 显示全部楼层
回复【楼主位】fdsa:
---------------------------------
在if(USART2_RX_STA&0X8000)里面,添加printf,打印出你的tt值,看一下。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-4-28
在线时间
1 小时
 楼主| 发表于 2013-5-4 21:17:52 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
已经测试,在while循环里面tt值就是进入while的值不改变。我安卓软件是按键使用onTouch,摁下的时候发送一个字符做命令,弹起的时候发送另一个字符,如果用if可以看到摁下和弹起显示两个不同的字符,但是while则只能卡死在摁下的字符,tt的值不会改变。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-5-4 22:42:49 | 显示全部楼层
回复【3楼】fdsa:
---------------------------------
USART2_RX_STA=0;放在while之前。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-4-28
在线时间
1 小时
 楼主| 发表于 2013-5-5 11:00:39 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
实际测试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<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]; 
}    
}
这个函数里面的if函数的条件似乎每次都能得到满足,不是吗?为什么USART2_RX_STA=0可以使程序卡死?  麻烦原子哥给解释一下,谢谢。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-5-5 13:17:38 | 显示全部楼层
回复【5楼】fdsa:
---------------------------------
因为USART2_RX_STA=0,是串口启动下一次接收的前提.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 21:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表