当串行数据计算为特定数字时仅调用一次函数
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()
函数。
所以我的逻辑有点像屁股。但这就是我要做的:我有一个串行数据流和一些布尔值要跟踪。我真正想做的是:"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()
函数。