串行数据评估为特定数字

时间:2016-09-18 05:08:12

标签: serial-port logic processing

所以我的逻辑是一种屁股。但这就是我想要的:我有一串串行数据和一些布尔值来跟踪。我真正想要做的是:“当串行数据等于[X]时,只调用一次特定的函数。”

基本上:获取传入的串行数据有点像按钮。对于各个参数,我总是在将标志设置为false的位置上摇摇欲坠。现在我只有一个完全重置,如果没有任何进入,重置它。

任何关于将布尔值设置为假的个人参数的帮助都将受到赞赏。我大多只是看不到它。

最终,这件事会做的事情是“当串口是2时,在屏幕上得到一个随机点,画一个圆圈”但是现在,只是解决我的错误逻辑。

 
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);

}

1 个答案:

答案 0 :(得分:0)

您需要跟踪您是否已经看到目标值。您可以使用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()函数。