Serial.parseInt() 和 Serial.read() 之间的实际区别?

Actual difference between Serial.parseInt() and Serial.read()?

我正在写一个关于逻辑门工作的简单程序(它是在 arduino 中编程的,输入是使用串行监视器获取的),我真的不明白 parseint 的工作,我读过我在网上阅读了很多文章,但仍然不是我清楚。 这是代码

boolean a,b;
int val;

void setup(){
Serial.begin(9600);
  Serial.setTimeout(2000);
Serial.println("Enter what logic you want to implement: \nFor AND enter 1\n For NAND enter 2\n For OR enter 3\n For NOR enter 4\n For EX- OR enter 5\n For EX-NOR enter 6\n For NOT enter 7");
}

void loop(){
if(Serial.available()>0){
val= Serial.read();
if(val=='1')
{
//AND
Serial.println("SELECTED AND GATE:");
Serial.println("Enter your inputs:");
a=Serial.parseInt(); 
Serial.println(a); 
b=Serial.parseInt(); 
Serial.println(b);
if(a && b){
Serial.print("OUTPUT:"); 
Serial.println("1"); 
}
else{
Serial.print("OUTPUT:"); 
Serial.println("0");
}
}
else if(val=='2'){
//NAND
Serial.println("SELECTED NAND GATE:");
Serial.println("Enter your inputs:"); 
a=Serial.parseInt(); 
Serial.println(a); 
b=Serial.parseInt(); 
Serial.println(b);
if(a && b){
Serial.print("OUTPUT:"); 
Serial.println("0"); 
} 
else{
Serial.print("OUTPUT:"); 
Serial.println("1");
}
}
else if(val=='3'){
//OR
Serial.println("SELECTED OR GATE:");
Serial.println("Enter your inputs:");
a=Serial.parseInt();
Serial.println(a); 
b=Serial.parseInt();
Serial.println(b);
if(a || b){
Serial.print("OUTPUT:");
Serial.println("1"); 
} 
else{
Serial.print("OUTPUT:"); 
Serial.println("0");
}
}
else if(val=='4'){
//NOR
Serial.println("SELECTED NOR GATE:"); 
Serial.println("Enter your inputs:");
a=Serial.parseInt();
Serial.println(a); 
b=Serial.parseInt(); 
Serial.println(b); 
if(a || b){
Serial.print("OUTPUT:"); 
Serial.println("0"); 
} 
else{
Serial.print("OUTPUT:"); 
Serial.println("1");
}
}
else if(val=='5'){
// EX-OR
Serial.println("SELECTED EX-OR GATE:");
Serial.println("Enter your inputs:");
a=Serial.parseInt(); 
Serial.println(a);
b=Serial.parseInt(); 
Serial.println(b); 
if(a == b){
Serial.print("OUTPUT:"); Serial.println("0"); 
} 
else{
Serial.print("OUTPUT:"); Serial.println("1");
}
}
else if(val=='6'){
//EX-NOR
Serial.println("SELECTED EX-NOR GATE:");
Serial.println("Enter your inputs:");
a=Serial.parseInt();
Serial.println(a); 
b=Serial.parseInt(); 
Serial.println(b); 
if(a == b){
Serial.print("OUTPUT:");
Serial.println("1"); 
} 
else{
Serial.print("OUTPUT:"); 
Serial.println("0");
}
} 
else if(val=='7'){
//NOT
Serial.println("SELECTED NOT GATE:");
Serial.println("Enter your inputs:"); 
a=Serial.parseInt(); 
Serial.println(a); 
if(a==1){
Serial.print("OUTPUT:"); Serial.println("0");
} 
else{
Serial.print("OUTPUT:"); Serial.println("1");
}
} 
else{
Serial.println("No gate is assigned to this number");
}
}
}

在 serial.available 之后插入上面的代码我使用 serial.read 读取 val 但如果我使用 serial.parseint 它不起作用,类似地在我使用 parseint 的每个门函数中(我知道它 returns 字符串的整数表示),如果我输入 serial.read 它不起作用。 有人能告诉我为什么会发生这种情况吗?这两者的实际差异是什么 b/w。

parseInt() 在超时或遇到非数字字符之前读取尽可能多的字符。它会将 assemble 那些 ascii 字符转换为数字并从 ascii 转换并返回一个实际的 int。

read() 只是从串行缓冲区中读取一个字符,然后 returns 它(提升为一个 int)或 -1 如果没有可读取的内容。 read 不会从 ascii 转换任何内容,因此如果您从串行监视器发送“1”,它将读取 49(“1”的 ascii 代码)。

在您的代码中,您将读取的内容与 ascii 值进行比较,因为您将其与“1”进行比较。如果它通过 parseInt 转换为数字,那么它实际上是 1 而不是 49。1 不等于 49,所以这不起作用。

在您使用 parseInt 的其他函数中,您正在比较这些东西并将它们视为数字而不是 ascii 字符。所以你需要parseInt。