Go Down

Topic: Serial Port Not Reading Correctly (Read 712 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