关于 蓝牙串口 控制程序 不能“死循环” 问题
用arduino mini + 升压模块 + mos管 做了个呼吸灯,用蓝牙控制,呼吸效果代码只执行一次,求教该怎么破解?int pin = 11;
int i;
void LED_open();
void LED_close();
void low();
void middle();
void high();
void setup()
{
Serial.begin(9600);
pinMode(pin, OUTPUT);
}
void loop()
{
while(Serial.available())
{
char a=Serial.read();
if(a=='1')
{ LED_open();
Serial.println("ON");
}
else if(a=='2')
{LED_close();
Serial.println("OFF");}
else if(a=='3')
{low();
Serial.println("STATE_1");
}///////////////////////只执行一次,期望此条件下不断执行????????
else if(a=='4')
{while(i<)
{middle();
if(a=='2')
break;
}
Serial.println("STATE_2");
}
else if(a=='5')
{ high();
Serial.println("STATE_3");
}
}
}
void LED_open ( )
{
digitalWrite(pin, HIGH);
}
void LED_close ( )
{
digitalWrite(pin, LOW);
}
void low ( )
{
for (int a = 0; a <= 2000; a = a + 2)
{ delay(1);
digitalWrite(pin, HIGH);
delayMicroseconds(a);
digitalWrite(pin, LOW);
delayMicroseconds(2000 - a);
}
for (int a = 2000; a >= 0; a = a - 2)
{ delay(1);
digitalWrite(pin, HIGH);
delayMicroseconds(a);
digitalWrite(pin, LOW);
delayMicroseconds(2000 - a);
}
}
void middle()
{
for (int a = 0; a <= 3500; a = a + 2)
{ delay(1);
digitalWrite(pin, HIGH);
delayMicroseconds(a);
digitalWrite(pin, LOW);
delayMicroseconds(3500 - a);
}
for (int a = 3500; a >= 0; a = a - 2)
{ delay(1);
digitalWrite(pin, HIGH);
delayMicroseconds(a);
digitalWrite(pin, LOW);
delayMicroseconds(3500 - a);
}
}
void high()
{ for (int a = 0; a <= 5000; a = a + 2)
{ delay(1);
digitalWrite(pin, HIGH);
delayMicroseconds(a);
digitalWrite(pin, LOW);
delayMicroseconds(5000 - a);
}
for (int a = 5000; a >= 0; a = a - 2)
{ delay(1);
digitalWrite(pin, HIGH);
delayMicroseconds(a);
digitalWrite(pin, LOW);
delayMicroseconds(5000 - a);
}
} Serial.available() 本身就是当有串口数据过来的时候才会为 1,这时候才会进入while。一旦串口的数据被读走或者你j进入了while,Serial.available()会被清零 0。所以只执行一次。
while(Serial.available())
{
char a=Serial.read();
}
这样就可以了,之前是因为你的串口只读取一次数据,所以程序只会运行一次,你试下。 急速未来 发表于 2017-6-4 14:32
while(Serial.available())
{
这样也不行的,在if语句中会显示a未定义,即使在loop中定义了a,收到a后也没反应 我现在能在if后实现while死循环,可是无法通过蓝牙跳出 davidwxj 发表于 2017-6-11 18:31
我现在能在if后实现while死循环,可是无法通过蓝牙跳出
死循环台跳不出来
哥们,我有一个大胆的想法,你可以尝试设置一个 mark 变量用于记录,然后开始死循环,如果想要退出循环也很简单,就是每次循环的时候都检测串口数据就可以了,不知道你对执行效率有没有要求,
1,设置一个变量记录当前状态 while(mark == 1){。。。。。。。。。,if(Serial。available())}大概就是这样,然后就可以退出了
页:
[1]