Pages: [1]   Go Down
Author Topic: Serial Port Not Reading Correctly  (Read 572 times)
0 Members and 1 Guest are viewing this topic.
New Hampshire, USA
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Edison Member
*
Karma: 48
Posts: 1633
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

New Hampshire, USA
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Edison Member
*
Karma: 48
Posts: 1633
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

New Hampshire, USA
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

New Hampshire, USA
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
not 1
255
not 1
255
not 1
255
not 1
255
Logged

Offline Offline
Edison Member
*
Karma: 48
Posts: 1633
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pete
Logged

New Hampshire, USA
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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)?
Logged

Pages: [1]   Go Up
Jump to: