做蓝牙发送,程序卡死在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++);
}
}
...全文
253 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。
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

27,375

社区成员

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

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