做蓝牙发送,程序卡死在while(!TI)这,求解

头疼肝疼 2019-03-17 12:46:02
在做用手势识别传感器通过蓝牙发送手势指令。但是程序总是卡死在while(!TI)的死循环中,将他注掉手势可识别但蓝牙发不出去;留着的话手势识别直接无反应。。。程序如下,论坛排版
#include "stc15f2k60s2.h"
#include "GesturePAJ7620.h"
#include "oled.h"
#include "GesturePAJ7620.c"
#include "oled.c"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define GES_REACTION_TIME 200 // You can adjust the reaction time according to the actual circumstance.
#define GES_ENTRY_TIME 500 // When you want to recognize the Forward/Backward gestures, your gestures' reaction time must less than GES_ENTRY_TIME(0.8s).
#define GES_QUIT_TIME 1000
#define Delay_2us() _nop_();_nop_();_nop_();_nop_()
uchar GestureValue = 0;
unsigned char send_data;
void GestureRecognition(void);
void Delay_ms(uint ms);
void send_init();
//***********************主程序******************************
void main(void)
{
OLED_Init(); //OLED 初始化
OLED_Clear(); //OLED清屏
Delay_ms(2000);
OLED_Clear(); //OLED清屏
GestureValue = 0;
OLED_ShowString(8, 0,"* Gesture *");//
OLED_ShowString(8, 4,"Wating...");//
Delay_ms(1000);
paj7620Init();//手势模块 初始化
send_init();
Delay_ms(200);
while(1)
{
GestureRecognition();
mcu_led = ~mcu_led;
SBUF=GestureValue;
while(!TI); //卡死在这里。。。。。。。。。。。。。。
TI=0;
}
}
/**********************************************************************/
void send_init()
{
TMOD =0x20; //设定T1定时器工作方式2
TH1=0xfd; //T1定时器装初值
TL1=0xfd; //T1定时器装初值
TR1=1; //启动T1定时器
SCON =0x40; //SM0=0 SM1=1串行口寄存器工作方式1,REN=1允许串口接收
PCON=0x00; //SMOD设置为0
EA=1; //开总断
ES=1; //开串口中断
}

void GestureRecognition(void)
{
GestureData = paj7620ReadReg(0x43,1); // Read Bank_0_Reg_0x43/0x44 for gesture result.
if(GestureData!=0xFF)
{
switch (GestureData) // When different gestures be detected, the variable 'data' will be set to different values by paj7620ReadReg(0x43, 1, &data).
{
case GES_RIGHT_FLAG:
Delay_ms(GES_ENTRY_TIME);
GestureData=paj7620ReadReg(0x43, 1);
if(GestureData == GES_FORWARD_FLAG)
{
GestureValue = 5;
OLED_Clear();
OLED_ShowString(8, 0,"* Gesture *");//
OLED_ShowString(2, 3,"Forward");//
Delay_ms(GES_QUIT_TIME);
}
else if(GestureData == GES_BACKWARD_FLAG)
{
GestureValue = 6;
OLED_Clear();
OLED_ShowString(8, 0,"* Gesture *");//
OLED_ShowString(2, 3,"Backward");//
Delay_ms(GES_QUIT_TIME);
}
else
{
GestureValue = 4;
OLED_Clear();
OLED_ShowString(8, 0,"* Gesture *");//
OLED_ShowString(2, 3,"Right");//
}
break;
case GES_LEFT_FLAG:
Delay_ms(GES_ENTRY_TIME);
GestureData=paj7620ReadReg(0x43, 1);
if(GestureData == GES_FORWARD_FLAG)
{
GestureValue = 5;
OLED_Clear();
OLED_ShowString(8, 0,"* Gesture *");//
OLED_ShowString(2, 3,"Forward");//
Delay_ms(GES_QUIT_TIME);
}
else if(GestureData == GES_BACKWARD_FLAG)
{
GestureValue = 6;
OLED_Clear();
OLED_ShowString(8, 0,"* Gesture *");//
OLED_ShowString(2, 3,"Backward");//
Delay_ms(GES_QUIT_TIME);
}
else
{
GestureValue = 3;
OLED_Clear();
OLED_ShowString(8, 0,"* Gesture *");//
OLED_ShowString(2, 3,"Left");//
}
break;
case GES_UP_FLAG:
Delay_ms(GES_ENTRY_TIME);
GestureData=paj7620ReadReg(0x43, 1);
if(GestureData == GES_FORWARD_FLAG)
{
GestureValue = 5;
OLED_Clear();
OLED_ShowString(8, 0,"* Gesture *");//
OLED_ShowString(2, 3,"Forward");//
Delay_ms(GES_QUIT_TIME);
}
else if(GestureData == GES_BACKWARD_FLAG)
{
GestureValue = 6;
OLED_Clear();
OLED_ShowString(8, 0,"* Gesture *");//
OLED_ShowString(2, 3,"Backward");//
Delay_ms(GES_QUIT_TIME);
}
else
{
GestureValue = 1;
OLED_Clear();
OLED_ShowString(8, 0,"* Gesture *");//
OLED_ShowString(2, 3,"Up");//
}
break;
case GES_DOWN_FLAG:
Delay_ms(GES_ENTRY_TIME);
GestureData=paj7620ReadReg(0x43, 1);
if(GestureData == GES_FORWARD_FLAG)
{
GestureValue = 5;
OLED_Clear();
OLED_ShowString(8, 0,"* Gesture *");//
OLED_ShowString(2, 3,"Forward");//
Delay_ms(GES_QUIT_TIME);
}
else if(GestureData == GES_BACKWARD_FLAG)
{
GestureValue = 6;
OLED_Clear();
OLED_ShowString(8, 0,"* Gesture *");//
OLED_ShowString(2, 3,"Backward");//
Delay_ms(GES_QUIT_TIME);
}
else
{
GestureValue = 2;
OLED_Clear();
OLED_ShowString(8, 0,"* Gesture *");//
OLED_ShowString(2, 3,"Down");//
}
break;
case GES_FORWARD_FLAG:
GestureValue = 5;
OLED_Clear();
OLED_ShowString(8, 0,"* Gesture *");//
OLED_ShowString(2, 3,"Forward");//
Delay_ms(GES_QUIT_TIME);
break;
case GES_BACKWARD_FLAG:
GestureValue = 6;
OLED_Clear();
OLED_ShowString(8, 0,"* Gesture *");//
OLED_ShowString(2, 3,"Backward");//
Delay_ms(GES_QUIT_TIME);
break;
case GES_CLOCKWISE_FLAG:
GestureValue = 7;
OLED_Clear();
OLED_ShowString(8, 0,"* Gesture *");//
OLED_ShowString(2, 3,"Clockwise");//
break;
case GES_COUNT_CLOCKWISE_FLAG:
GestureValue = 8;
OLED_Clear();
OLED_ShowString(8, 0,"* Gesture *");//
OLED_ShowString(2, 3,"anti-clockwise");//
break;
default:
GestureData=paj7620ReadReg(0x44, 1);
if (GestureData == GES_WAVE_FLAG)
{
GestureValue = 9;
OLED_Clear();
OLED_ShowString(8, 0,"* Gesture *");//
OLED_ShowString(2, 3,"Wave");//
}
else
GestureValue = 0;
break;
}
if(GestureValue!=0)
{
// GestureHandleFun();
}
}
}

void Delay_ms(unsigned int ms)
{
unsigned int De_Cnt;
while( (ms--) != 0)
{
for(De_Cnt = 0; De_Cnt < 600; De_Cnt++);
}
}
...全文
254 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yishumei 2019-03-20
  • 打赏
  • 举报
回复
引用 3 楼 头疼肝疼 的回复:
[quote=引用 1 楼 一树梅的回复:]只发送不接收,而且没有串口中断处理函数,把串口中断关了就行了,ES = 0。
能看到我的回复吗???[/quote] 修改后的代码有串口中断处理函数,得加上ES = 1,否则卡死在while(tx_flag==1)。 串口中断处理函数void Uart_Is_Send () interrupt 4 using 1最好把using 1去掉。
头疼肝疼 2019-03-20
  • 打赏
  • 举报
回复
引用 1 楼 一树梅的回复:
只发送不接收,而且没有串口中断处理函数,把串口中断关了就行了,ES = 0。
能看到我的回复吗???
头疼肝疼 2019-03-20
  • 打赏
  • 举报
回复
引用 1 楼 一树梅 的回复:
只发送不接收,而且没有串口中断处理函数,把串口中断关了就行了,ES = 0。
用·你的·方法,这样改了,手势只能识别第一次的手势,且没有数据从蓝牙发出。。。
void main(void)
{
	OLED_Init();	//OLED 初始化 
	OLED_Clear();	//OLED清屏 
	Delay_ms(2000);
	OLED_Clear();	//OLED清屏
	GestureValue = 0;
	OLED_ShowString(8, 0,"* Gesture *");//
	OLED_ShowString(8, 4,"Wating...");//
	Delay_ms(1000);
	paj7620Init();//手势模块 初始化 
	send_init();	
	tx_flag=0;
	TI=0;
	Delay_ms(200);	 
 	while(1)
	{ 		
		GestureRecognition();	
		mcu_led = ~mcu_led;
		if(GestureValue!=0)
		Send_Char(GestureValue);
	}
}void Send_Char(uchar a)
{
  tx_flag=1;                                                  
  SBUF=a;
  while(tx_flag==1);

}void send_init()
{
  TMOD =0x20; //设定T1定时器工作方式2
  TH1=0xfd;   //T1定时器装初值
	TL1=0xfd;   //T1定时器装初值
  TR1=1;      //启动T1定时器  
	//ET1=1;      //允许T1中断
  SCON =0x50; //SM0=0 SM1=1串行口寄存器工作方式1,REN=1允许串口接收  
	PCON=0x00;	//SMOD设置为0
 	EA=1;       //开总断
 	ES=0;       //开串口中断
}void Uart_Is_Send () interrupt 4 using 1
{
  if(TI)
  {
    TI=0;          
    tx_flag=0;
  }
  if(RI) 
  {
    RI=0;
  }	
}
yishumei 2019-03-17
  • 打赏
  • 举报
回复
只发送不接收,而且没有串口中断处理函数,把串口中断关了就行了,ES = 0。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧