极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16747|回复: 6

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

[复制链接]
发表于 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);
  }
}
回复

使用道具 举报

发表于 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();
     }
这样就可以了,之前是因为你的串口只读取一次数据,所以程序只会运行一次,你试下。
回复 支持 反对

使用道具 举报

发表于 2017-6-11 16:14:00 来自手机 | 显示全部楼层
急速未来 发表于 2017-6-4 14:32
while(Serial.available())

     {

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

使用道具 举报

发表于 2017-6-11 18:31:30 来自手机 | 显示全部楼层
我现在能在if后实现while死循环,可是无法通过蓝牙跳出
回复 支持 反对

使用道具 举报

发表于 2017-6-16 08:22:22 | 显示全部楼层
davidwxj 发表于 2017-6-11 18:31
我现在能在if后实现while死循环,可是无法通过蓝牙跳出

死循环台跳不出来
回复 支持 反对

使用道具 举报

发表于 2017-6-22 22:52:58 | 显示全部楼层
哥们,我有一个大胆的想法,你可以尝试设置一个 mark 变量用于记录,然后开始死循环,如果想要退出循环也很简单,就是每次循环的时候都检测串口数据就可以了,不知道你对执行效率有没有要求,
1,设置一个变量记录当前状态 while(mark == 1){。。。。。。。。。,if(Serial。available())}大概就是这样,然后就可以退出了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 05:57 , Processed in 0.052737 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表