Search code examples
arduinoarduino-unoarduino-ideparseintserial-monitor

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


i am writing a simple program on working of logic gates (it is being programmed in arduino inputs are taken using serial monitor), i dont really understand the working of parseint and read ive read numerous articles online but still its not clear to me. here is the code

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

int the code above after serial.available ive used serial.read to read the val but if i use serial.parseint it doesnt work, similarly in every gate function ive used parseint (i know it returns the integer representation of the string) and if i put serial.read it doesnt work. can someone please tell the difference why this happens and whats the actual diff b/w these two.


Solution

  • parseInt() reads as many characters as it can before it times out or hits a non-digit character. It will assemble those ascii characters into a number and convert from ascii and give you back an actual int.

    read() just reads one character from the serial buffer and returns it (promoted to an int) or -1 if there's nothing to read. read will not convert anything from ascii so if you send a '1' from the serial monitor it will read 49 (the ascii code for '1').

    In your code you are comparing what you read to an ascii value since you compare to '1'. If it gets converted to a number by parseInt then it would actually be a 1 and not a 49. 1 doesn't equal 49 so that doesn't work.

    In your other functions where you use parseInt you are comparing those things and treating them as numbers and not ascii characters. So there you need parseInt.