所以我的逻辑是一种屁股。但这就是我想要的:我有一串串行数据和一些布尔值来跟踪。我真正想要做的是:“当串行数据等于[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);
}
答案 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()
函数。