Go Down

Topic: Serial Port Not Reading Correctly (Read 832 times) previous topic - next topic

Eric_R

I am trying to get my Arduino Uno to communicate with Processing in order to use my Kinect Sensor, and ran in to trouble passing data from the Processing to the Uno.  I tried running a basic sketch to change the brightness of an LED based on the serial input, and got some unusual results.  No matter what I type into the Serial Monitor, Serial.read() returns -1.  Please help!

Code: [Select]
void setup(){
  pinMode(11, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  if (Serial.available()) {
    int input = Serial.read();
    // debug serial input
    Serial.println(Serial.read());
    Serial.println(input);
    // write to LED on PWM 11
    analogWrite(11, input);
  }
}


Sample Serial Monitor:
keys pressed: 1, 2, 3, 4, 5, 6, 7, 8, 9, 0
Quote
-1
49
-1
50
-1
51
-1
52
-1
53
-1
54
-1
55
-1
56
-1
57
-1
48


el_supremo

That output is correct (of course).
If Serial.available() is non-zero, which is what you test for, you are only guaranteed that there is at least one character in the queue. You are reading two.

Pete

Eric_R

OK, I see what you mean.  But why would it output numbers in the 50s when I send numbers less than 10?

el_supremo

You are printing each character as a decimal number. Each character is represented using ASCII code. Look up an ASCII table on Google. You'll find that the character for 1 is represented by the decimal number 49.
Changing "int input" to "byte input" will cause the variable to be printed as a character instead of as a decimal number.

Pete

Eric_R

Even doing that, I still get 49 back by pressing 1.  This is what the code says now:
Code: [Select]
if (Serial.available()) {
    byte input = Serial.read();
    // debug serial input
    Serial.println(input);

Eric_R

I added debugging lines to the code I was actually using while communicating with Processing, and got different results.  Now the serial input never equals 1 and byte input always equals 255

Code: [Select]
if (Serial.read() > 0) {
    byte input = Serial.read();
    if (input == '1') {
      Serial.println("1");
      digitalWrite(13, HIGH);
    } else {
      Serial.println("not 1");
      digitalWrite(13, LOW);
    }
    Serial.println(input);
  }

Serial Monitor:
Code: [Select]
not 1
255
not 1
255
not 1
255
not 1
255

el_supremo

Why did you do this? It was right before.
Code: [Select]
if (Serial.read() > 0) {

Pete

Eric_R

I don't know why I had that.  Thanks.  So that solved my main problem of the Arduino not talking to Processing (silly me).  Now this is probably a really stupid question, but how do I get the serial input to read integers (i.e. values from 0 - 255)?

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy