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输出的思路
一上半天的时间过了去写其他的了不懂留言 加群等