关于串口输入的一个问题-Arduino中文社区 - Powered by Discuz!
查看: 170|回复: 3

[未解决] 关于串口输入的一个问题

[复制链接]

该用户从未签到

发表于 2021-9-15 10:30 | 显示全部楼层 |阅读模式
      大佬们好,我在练习编程时出了一个小问题。      我这里是想当  串口输入1时,2口的灯常亮,当输入2时,3口的灯和2口同时亮,等三秒后同时熄灭。我这里希望在这个同时熄灭前的三秒内,如果检测到输入1,可以回到只输入1的状态,即只有2的灯常亮。我实验后发现我的程序在处理完当前的数据之前无法处理之后输入的数,想问问大佬有没有好方法解决它。



  1. int mode;
  2. int led;
  3. void setup() {
  4.   // put your setup code here, to run once:
  5.   Serial.begin(9600);
  6.   pinMode(2,OUTPUT);
  7.   pinMode(3,OUTPUT);
  8. }

  9. void loop() {
  10.   // put your main code here, to run repeatedly:
  11.   led = digitalRead(2);
  12.   if(Serial.available()>0){
  13.     mode = Serial.read();
  14.     mode = mode - 48;
  15.     Serial.flush();
  16.     Serial.println(mode);

  17.     if(mode == 0){
  18.       digitalWrite(2,LOW);
  19.       digitalWrite(3,LOW);
  20.       Serial.println("led off");
  21.       }
  22.     if(mode == 1){
  23.       digitalWrite(2,HIGH);
  24.       Serial.println("led on");
  25.      }
  26.      if(mode ==2 && led ==HIGH){
  27.        digitalWrite(3,HIGH);
  28.        Serial.println("waiting");
  29.        for(int i = 1;i<1000;i++){
  30.             delay(10);
  31.             if(mode!=2){
  32.               Serial.println("change");
  33.               break;

  34.             }  
  35.           }

  36.       Serial.println("led off");
  37.       digitalWrite(2,LOW);
  38.       digitalWrite(3,LOW);
  39.      }
  40.    }



  41. }
复制代码



该用户从未签到

 楼主| 发表于 2021-9-15 10:32 | 显示全部楼层
我有试过用SerialEvent试了一下,也失败了

签到天数: 68 天

[LV.6]常住居民II

发表于 2021-9-15 10:40 | 显示全部楼层
用 millis() 替换 delay()
或者用AVR 的方式使用串口中断

该用户从未签到

 楼主| 发表于 2021-9-15 14:52 | 显示全部楼层
XlinliY.Zhang 发表于 2021-9-15 10:40
用 millis() 替换 delay()
或者用AVR 的方式使用串口中断

谢谢,我拿millis()试了一下,确实状态可以切换了,但是灯不能灭了,请问您能帮我看看吗

  1. int mode;
  2. int led;
  3. unsigned long prevCloes = 0;
  4. void setup() {
  5.   // put your setup code here, to run once:
  6.   Serial.begin(9600);
  7.   pinMode(2,OUTPUT);
  8.   
  9.   pinMode(3,OUTPUT);
  10. }

  11. void loop() {
  12.   // put your main code here, to run repeatedly:
  13.   led = digitalRead(2);
  14.   if(Serial.available()>0){
  15.     mode = Serial.read();
  16.     mode = mode - 48;
  17.     Serial.flush();
  18.     Serial.println(mode);
  19.    
  20.     if(mode == 0){
  21.       digitalWrite(2,LOW);
  22.       digitalWrite(3,LOW);
  23.       Serial.println("led off");
  24.       }
  25.     if(mode == 1){
  26.       digitalWrite(2,HIGH);
  27.       digitalWrite(3,LOW);
  28.       Serial.println("led on");
  29.      }
  30.      if(mode ==2 && led ==HIGH){
  31.        prevCloes = millis();
  32.        Serial.println(prevCloes);
  33.        digitalWrite(3,HIGH);
  34.        Serial.println("waiting");
  35.        if(millis() - prevCloes > 1000){
  36.         Serial.println("led off");
  37.       digitalWrite(2,LOW);
  38.       digitalWrite(3,LOW);
  39.        }
  40.       
  41.       }
  42.       
  43.      
  44.      }
  45.    }

复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

继电器断开瞬间esp32重启或者网络断开
继电器断开瞬间esp32重启
主要模块: 芯片ESP32-WROOM-32D 供电用的220V转5V模块,700mA 网络LAN8720A模块 继电
【Arduino】168种传感器系列实验(171)---HLK-V20离线语音模块
【Arduino】168种传感器系
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
【Arduino】168种传感器系列实验(181)---1.3寸OLED液晶屏模块
【Arduino】168种传感器系
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
大佬们,帮帮忙
大佬们,帮帮忙
为什么我写的子程序,单独使用运行没问题,两个程序合起来就只会运行一个程序
OLED 128*64自制可达10000000个选项的菜单(已更新)
OLED 128*64自制可达10000
OLED 128*64自制可达10000000个选项的菜单 温馨提示: 建议占个楼再食用本帖子
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表