fengchuiyu1994 发表于 2016-5-16 18:23:40

关于 蓝牙串口 控制程序 不能“死循环” 问题

用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);
}
}

164335413 发表于 2016-5-17 17:22:55

Serial.available() 本身就是当有串口数据过来的时候才会为 1,这时候才会进入while。一旦串口的数据被读走或者你j进入了while,Serial.available()会被清零 0。所以只执行一次。

急速未来 发表于 2017-6-4 14:32:29

while(Serial.available())

   {
   char a=Serial.read();
   }
这样就可以了,之前是因为你的串口只读取一次数据,所以程序只会运行一次,你试下。

davidwxj 发表于 2017-6-11 16:14:00

急速未来 发表于 2017-6-4 14:32
while(Serial.available())

   {


这样也不行的,在if语句中会显示a未定义,即使在loop中定义了a,收到a后也没反应

davidwxj 发表于 2017-6-11 18:31:30

我现在能在if后实现while死循环,可是无法通过蓝牙跳出

急速未来 发表于 2017-6-16 08:22:22

davidwxj 发表于 2017-6-11 18:31
我现在能在if后实现while死循环,可是无法通过蓝牙跳出

死循环台跳不出来

Albert,_Einste 发表于 2017-6-22 22:52:58

哥们,我有一个大胆的想法,你可以尝试设置一个 mark 变量用于记录,然后开始死循环,如果想要退出循环也很简单,就是每次循环的时候都检测串口数据就可以了,不知道你对执行效率有没有要求,
1,设置一个变量记录当前状态 while(mark == 1){。。。。。。。。。,if(Serial。available())}大概就是这样,然后就可以退出了
页: [1]
查看完整版本: 关于 蓝牙串口 控制程序 不能“死循环” 问题