2 u012052289 u012052289 于 2013.12.27 16:28 提问

单片机通过HC-06与手机通信

最近在做一个单片机项目,需要用到手机通过HC-06蓝牙模块与单片机通信,于是写了下面一段代码。但是却遇到了一个问题就是把这个程序烧进开发板之后,当手机第一次发送ab时相应的led亮,但手机第二次发送ab时,led灯没有反应。请大家帮忙解答!
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit lamp = P1^0;
sbit fan = P1^1;
char rec[2];
uchar i=0;
uchar signal;
void delay(uint x)
{
uchar i;
uint j;
for(j=0;j<x;j++)
{
for(i=0;i<202;i++);
for(i=0;i<100;i++);
}
}
void initchuankou()
{
SCON = 0X50;
PCON = 0X00;
TMOD = 0X20;
TH1 = 0XFD;
TL1 = 0XFD;
TR1 = 1;
}
void handle()
{
if(rec[0]=='a'&&rec[1]=='b') lamp = ~lamp;
if(rec[0]=='c'&&rec[1]=='d') fan = ~fan;

// if(rec[0]=='e'&&rec[1]=='f') lamp = 1;
}
void main()
{
delay(10);
initchuankou();
IE = 0X90;
lamp = 1;
fan = 1;
while(1){
handle();
}
}
void serial1(void) interrupt 4
{
EA = 0;
rec[i] = SBUF;
i++;
if(i==2) i=0;
RI = 0;

EA = 1;
}

2个回答

a77434568
a77434568   2013.12.30 18:14
已采纳

在我看来,应该是你代码逻辑有问题
void handle()
{
if(rec[0]=='a'&&rec[1]=='b') lamp = ~lamp;
if(rec[0]=='c'&&rec[1]=='d') fan = ~fan;

// if(rec[0]=='e'&&rec[1]=='f') lamp = 1;
}

这个函数当一直在对lamp和fan作取反操作,你第一次接受到的字符如果是ab的话,只要你不发送第二种字符,那么该函数中的第一条if语句就会一直被执行。

个人理解应该在handle函数执行后,把rec数组清空,然后再发第二次数据。

u012052289
u012052289 谢谢你的解惑!
4 年多之前 回复
sinat_34753400
sinat_34753400   2016.05.22 18:15

楼主,还在吗,我是来自2016.5.22的,可以给我发一份你当时做的项目么,宝宝在初学,1225527616@qq.com谢谢啦

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!