关于串口输入的一个问题-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1640|回复: 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试了一下,也失败了
发表于 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.    }

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

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 23:50 , Processed in 0.073167 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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