Arduino 延时不执行后面代码解决方案 io持续输出也能运行其他代码

这种延时,会导致延时ing后面的代码不执行

unsigned long start = 0;
String rxdata = "";//定义全局变量接收的字符串

//低级版本 IO输出延时  
void setup() {
  Serial.begin(115200); //设置串口初始化 波特率
  pinMode(LED_BUILTIN, OUTPUT);//设置IO输出  LED
  Serial.println("run_ok QQqun:51798659————XiaoHe_QQ496631085__");
  
}

void loop() {
  //接收串口数据
   while (Serial.available() > 0){
        rxdata += char(Serial.read());  //每次读一个char字符,并相加
        delay(2); //不延时2ms可能乱码等异常
    }
    


  if(rxdata.equals("kai")){//开机键按一下
    Serial.println("kai1ing"); 
    digitalWrite(LED_BUILTIN, HIGH);//输出高电平
    delay(1000);//停顿一秒   停顿的时候后面的代码不执行
    digitalWrite(LED_BUILTIN, LOW);//关
    Serial.print("over1");//输出
    
  }else if(rxdata.equals("last")){ //开机键一直按8秒
    Serial.println("last2ing"); 
    digitalWrite(LED_BUILTIN, HIGH);//输出高电平
    delay(8000);//停顿8秒    停顿的时候后面的代码不执行    如果想执行后面的代码请看高级版本
    digitalWrite(LED_BUILTIN, LOW);//
    Serial.print("over2");//
  }else{
    //打印接收到的字符
    if (rxdata.length() > 0){
      Serial.println(rxdata.length()); //打印接收到的字符的长度(调试串口有默认发送换行符) 
      Serial.print("jieshou:");
      Serial.println(rxdata); 
    }
  }




 if(start!=(millis()/1000)){  //每秒执行一次
    Serial.println(start);    
    start = (millis()/1000);  //函数millis 是取运行时间毫秒
  }


  rxdata = "";//结尾清空接受的字符串  不然里面的判断一直执行
}

 高级版本:

不冲突同一io   可用多io同时输出 不同时间 (这个自己添加)

unsigned long start = 0;
String rxdata = "";        //定义全局变量接收的字符串
unsigned int runtime1 = 0;  //定义运行io时间1秒数
unsigned int runtime2 = 0;  //定义运行io时间2秒数
bool runb1 = false;      //开始运行io的标志位1
bool runb2 = false;      //开始运行io的标志位2
//低级版本 IO输出延时  
void setup() {
  Serial.begin(115200); //设置串口初始化 波特率
  pinMode(LED_BUILTIN, OUTPUT);//设置IO输出  LED
  Serial.println("run_ok QQqun:51798659————XiaoHe_QQ496631085__");
  
}

void loop() {
  //接收串口数据
   while (Serial.available() > 0){
        rxdata += char(Serial.read());  //每次读一个char字符,并相加
        delay(2); //不延时2ms可能乱码等异常
    }
    

  if(rxdata.equals("kai")){//判断接收的字符串和kai是否一样  开机键按一下
    runb1 = true;   //开始运行标志    
  }else if(rxdata.equals("last")){ //判断接收的字符串  没有换行或回车符号
    runb2 = true;   //开始运行标志
  }else{
    //打印接收到的字符
    if (rxdata.length() > 0){
      Serial.println(rxdata.length()); //打印接收到的字符的长度(调试串口有默认发送换行符) 
      Serial.print("jieshou:");
      Serial.println(rxdata); 
    }
  }



 



 if(start!=(millis()/1000)){  //每秒执行一次     
    Serial.println(start);    
    start = (millis()/1000);  //函数millis 是取运行时间毫秒

    //开始判断是否要运行io     此段代码可以放在外面  如果io输出超过1秒且是整倍数放在每 秒执行函数里面  避免多次判断
    if(runb1){
      digitalWrite(LED_BUILTIN, HIGH);//IO开
    }else{
      digitalWrite(LED_BUILTIN, LOW); //
    }


    if(runb2){
      digitalWrite(LED_BUILTIN, HIGH);//IO开
    }else if(!runb1){
      digitalWrite(LED_BUILTIN, LOW); //
    }
    

   
    if(runb1){//标志位为真  io输出为真 就加时间
      if(runtime1>=1){  //判断io输出时间到了没有
        runb1=false;
        runtime1=0;
      }
      runtime1++;
    }
    
   
    if(runb2){//标志位为真  io输出为真 就加时间
      if(runtime2>=2){  //判断io输出时间到了没有
        runb2=false;
        runtime2=0;
      }
      runtime2++;
    }
   


    
  }


  rxdata = "";//结尾清空接受的字符串  不然里面的判断一直执行
}

高级版本有个bug ,发送字符串后 并不是立即就执行io,而是要等到运行时间约为整数的时候才会执行(也就是说start!=(millis()/1000)为真的时候就会执行io   代码放在它的区域里面 归它管)

 

当然也可以 修改这个问题,修改了怕入门级的看不懂,所以不要写的太深奥了,这篇毕竟就是给入门级的看的!提供一个io输出的思路

一上半天的时间过了去写其他的了不懂留言 加群等

 

posted @ 2019-11-06 11:13  xiaohe520  阅读(1528)  评论(0编辑  收藏  举报