Serial.read crazy results

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:

Really nice of you to take the time to write this, but it outputs exactly the same result. each byte on a similar line.

I have the feeling that this function is the answer, but I can't implement it:

You could search for PaulS's solution, which doesn't use String, and works.

Here, this should help you do what you need, and more importantly, LEARN more about what you are trying to do:

/*

  • Example for Serial2Int
  • When reading from the serial monitor, there are two important things to note:
  • (1) Bytes are read one at a time. So sending "246" will be read by your
  • code as '2', then '4', then '6'. If you want to identify them as related in some
  • way, you need a way to determine that. This example uses start and stop bytes.
  • (2) Sending a number through the monitor sends it's ASCII representation, not
  • the value itself. So typing 3 and hitting enter would send '3' or 51 as per the
  • ascii table. To account for this, we will be using atoi(), which takes a null
  • terminated array of chars, also known as a string, and produces the int equivalent.
    */

// To send a number through the serial monitor, put it between brackets
const char startByte = '<';
const char stopByte = '>';

// Maximum characters in an int + null terminated character
const short maxBuffer = 6;

void setup() {
Serial.begin(57600);
Serial.println("[Serial2Int]");
}

void loop() {
// Stores the characters between the start and stop bytes
static char buffer[maxBuffer];
// Keeps track of spot in buffer
static short index=0;

if (Serial.available() > 0 ) {
char inChar = Serial.read();

if (inChar==startByte) { // If start byte is received
index=0; // then reset buffer and start fresh
} else if (inChar==stopByte) { // If stop byte is received
buffer[index] = '\0'; // then null terminate
processData(buffer); // and process the data
index=0; // this isn't necessary, but helps limit overflow
} else { // otherwise
buffer[index] = inChar; // put the character into our array
index++; // and move to the next key in the array
}

/* Overflow occurs when there are more than 5 characters in between

  • the start and stop bytes. This has to do with having limited space
  • in our array. We chose to limit our array to 5 (+1 for null terminator)
  • because an int will never be above 5 characters */
    if (index>=maxBuffer) {
    index=0;
    Serial.println("Overflow occured, next value is unreliable");
    }
    }
    }

void processData(char buffer[]) {
unsigned int value = atoi(buffer); // convert string to int
Serial.print("Value: ");
Serial.println(value);
}

Some more discussion: Reading more than 1 byte. - #5 by system - Programming Questions - Arduino Forum. Or, you can use other people's solutions.... Who's solution worked, and where is PaulS's solution?
I want to try to do the same thing in a more simple way:

int incomingByte = 0; // for incoming serial data
boolean written = false;
void setup() {
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}

void loop() {
// send data only when you receive data:
if (Serial.available() > 0) Serial.print("I received: ");
while (Serial.available() > 0) {
incomingByte = Serial.read();
Serial.print((char)incomingByte);
written = true;
}
if(written){
Serial.println();
written = false;
}
}

Will this work? I don't have time to try it. I'm also learning here!
P.S. If it doesn't work, first try changing Serial.print((char)incomingByte); to Serial.write(incomingByte);

Will this work?

Is this a new parlour game?

AWOL:

Will this work?

Is this a new parlour game?

If it is, it's not a very good one.

I'm not playing games. What's a parlour game?

A trivial or pointless diversion.

Are you implying something negative about my post?