Go Down

Topic: Serial.read crazy results (Read 9528 times) previous topic - next topic

dxw00d

Quote
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.

Arrch


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 :)

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.


AWOL

Native American greeting?

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

dkl65

Here my version of your "Arduino Parrot":
Quote

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! :)

SunnyBoy

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:

http://arduino.cc/en/Reference/StreamReadBytes

AWOL

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

Arrch

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

/*
* 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);
}


dkl65

#23
May 13, 2012, 09:00 pm Last Edit: May 13, 2012, 09:19 pm by dkl65 Reason: 1
Some more discussion: http://arduino.cc/forum/index.php/topic,105451.msg791114.html#msg791114. 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:
Quote

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

AWOL

Quote
Will this work?

Is this a new parlour game?

dxw00d


Quote
Will this work?

Is this a new parlour game?

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

dkl65

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

AWOL

A trivial or pointless diversion.

dkl65

Are you implying something negative about my post?

AWOL

20 questions now?

Generally, and for very good reasons, it is best to use code tags, and not quote tags when posting code.

Go Up