Serial.read crazy results

Hello everyone,

I'm getting this problem that's driving me crazy, tried everything and googled for hours, now my last hope is this forum.

Here is the code:

int incomingByte = 0; // for incoming serial data

void setup() {
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}

void loop() {

// send data only when you receive data:
while ( Serial.available( ) > 0 ) {

incomingByte = Serial.read();

// say what you got:
Serial.print("I received: ");
Serial.println(incomingByte);

}
delay(500);

}

When I enter an integer, I should get it back right?

Here is what I get when I enter "4" instead:

Serial monitor:

I received: 52
I received: 10

Here is "0":

Serial monitor:

I received: 48
I received: 10

What am I missing?

Please advise

Thanks

You're missing the difference between the ASCII representation of a digit, and the digit itself.
Comes up about once a month here.

I get that one, but it doesn't explain the systematic second line = 10.
It is the ASCII symbol for a new line and I don't know how to get rid of it.

Any ideas?

You are going to get ASCII representation codes on Key stroke inputs , You will understand more on reading about ASCII values on respective Key Strokes, Google for it.

Carriage return / line feed,
13 / 10

and how can I fix this?

What do you mean "fix"?

Use something different to input your data, that doesn't send CR/LF.

thanks for your answer dxw00d, but man I'ma Newb :smiley:

what you wrote is like chinese to me. could you please explain further? I'd be grateful to you

Thanks

How are you entering your "4"? Are you using the serial monitor?

Yes

Maybe you can try Serial.write for incomingByte, and use if instead of while if you only need 1 byte. I might try it later.

There are two drop-downs at the bottom of the serial monitor. One of them selects what is sent at the end of whatever you type. It might say 'Newline', or 'Carriage return' currently. Try changing it to 'No line ending'.

If that doesn't work, you'll need a different terminal program.

Works great! with: 'No line ending'

but now it reads only one digit. So if I type 10, I get :

I received: 1
I received: 0

what should I change?

PS: Thanks dxw00d :slight_smile:

Why not read the terminator....and ignore it?

but now it reads only one digit. So if I type 10, I get :

It will. You are reading one character and printing it back. If you want to read multi-character strings, you'll need to construct them in your sketch.

SunnyBoy:
Works great! with: 'No line ending'

but now it reads only one digit. So if I type 10, I get :

I received: 1
I received: 0

what should I change?

PS: Thanks dxw00d :slight_smile:

You need start and stop bytes to know when you start receiving a new number and when you're done imputing an number in. Most people commonly use '<' and '>'. You read that into a buffer and then you can convert it to a number.

how?

Native American greeting?

You could search for PaulS's solution, which is quite popular.

Here my version of your "Arduino Parrot":

int incomingByte = 0; // for incoming serial data
String inString = ""; //to store serial data
void setup() {
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}

void loop() {
// send data only when you receive data:
while (Serial.available() > 0) {
incomingByte = Serial.read();
inString += (char)incomingByte; //add data to string
}
if (inString != ""){ //if the string isn't empty...
// say what you got:
Serial.print("I received: ");
Serial.println(inString);
inString = ""; //clear string for new input
}
}

Tell me if it works! :slight_smile: