当串行数据计算为特定数字时仅调用一次函数

Call a function only once while serial data evaluates to a specific number

所以我的逻辑有点像屁股。但这就是我要做的:我有一个串行数据流和一些布尔值要跟踪。我真正想做的是:"While serial data is equal to [X], call a specific function only once."

基本上:获取传入的串行数据,使其有点像按钮。对于在何处将各个参数的标志设置回 false,我总是犹豫不决。现在我只是完全重置,如果没有任何内容,请将其全部重置。

任何关于在何处将各个参数的布尔值设置回 false 的帮助将不胜感激。我主要是看不到它。

最终这个东西会按照 "while serial is 2, get a random point on the screen, and draw a circle" 的方式做一些事情但是现在,只是解决我的错误逻辑。

import processing.serial.*;
Serial myPort;  // Create object from Serial class
int val;

boolean wasTwo = false;
boolean wasFour = false;
boolean wasSeven = false;


// /dev/cu.LightBlue-Bean
void setup() 
{
    size(800, 800);
    printArray(Serial.list());
    String portName = Serial.list()[1];// /dev/cu.LightBlue-Bean
    myPort = new Serial(this, portName, 9600);
}

void draw(){
    background(0);

    if ( myPort.available() > 0) {  // If data is available,
        val = myPort.read();         // read it and store it in val 
    }

    if(val != 0){

        if(!wasTwo && val == 2){
            print("2");
            wasTwo = true;
        } 

        if(!wasFour && val == 4){
            print("4");
            wasFour = true;
        } 

        if(!wasSeven && val == 7){
            print("7");
            wasSeven = true;
        }

    } else {
        wasTwo = false;
        wasFour = false;
        wasSeven = false;
    }


    if(wasTwo){
        red();
    }

    if(wasFour){
        green();
    }

    if(wasSeven){
        blue();
    }

}

void red(){
    fill(255,0,0);
    ellipse(200,200, 200, 200);

}

void green(){
    fill(0,200,0);
    ellipse(400,400, 200, 200);

}

void blue(){
    fill(0,0,255);
    ellipse(600,600, 200, 200);

}

您需要跟踪是否已经看到目标值。您可以使用 boolean 变量来做到这一点。

然后当你读取串行数据时,你检查值。如果它 不是 目标值,那么您只需将 boolean 设置为 false。如果它目标值,那么你再做一次检查:你是否已经看到了目标值?如果不是,请调用您的函数并将 boolean 设置为 true。如果是这样,那么不要调用该函数。

将所有内容放在一起,可能如下所示:

boolean sawTarget = false;
int targetValue = 2;

void draw(){

   if ( myPort.available() > 0) {
      int serialValue = myPort.read();

      if(serialValue == targetValue){
          if(!sawTarget){
              doSomething();
          }
          sawTarget = true;
      }
      else{
          sawTarget = false;
      }
   }
}

另请注意,这假设您的系列事件的时间是正确的。请注意,您的串行事件的触发速度可能超过每秒 60 次,在这种情况下,您会积累大量未处理的事件。在这种情况下,您可能希望使用 while() 循环而不是最外层的 if 语句,或者使用 serialEvent() 函数。