2011-09-29 17 views
6

Ho eseguito il semplice programma seriale sul mio Arduino Uno, il che equivale a qualsiasi cosa venga digitata. Funziona perfettamente quando si esegue l'IDE di Arduino Sketch (v22).Perché non sono disponibili dati seriali sul mio Arduino?

int incomingByte = 0; // for incoming serial data 

void setup() { 
    Serial.begin(115200); // opens serial port, sets data rate 
} 

void loop() { 
    // send data only when you receive data: 
    if (Serial.available() > 0) { 
     // read the incoming byte: 
     incomingByte = Serial.read(); 

     // say what you got: 
     Serial.print("I received: "); 
     Serial.println(incomingByte, DEC); 
    } 
} 

(codice preso da http://arduino.cc/en/Serial/Available)

Tuttavia, preferisco non usare l'IDE Arduino e avrei preferito compilare il mio codice C++ con avr-g ++, così ho scritto questo, che dovrebbe funzionare esattamente lo stesso di sopra:

extern "C" { 
#include <avr/io.h> 
} 
#include <HardwareSerial.h> 

extern "C" void __cxa_pure_virtual() { while(1); } 

int main (void) 
{ 
    int incomingByte = 0; 

    Serial.begin(115200); 

    while (1) { 
     if (Serial.available() > 0) { 
      incomingByte = Serial.read(); 

      //print as an ASCII character 
      Serial.print("received: "); 
      Serial.println(incomingByte, DEC); 
     } 
    } 
    return 1; 
} 

Compilare ed eseguirlo, ma non funziona. Non ho mai visto il mio testo richiamato a me. Ho provato a stampare il valore di Serial.available() nel ciclo while(1), ed è sempre zero. Ogni volta che digito sulla tastiera, vedo il LED RX acceso, ma dopo non succede nulla. Posso modificare il mio codice per chiamare con successo Serial.println() finché non è compreso tra il condizionale Serial.available().

Ho confermato che il mio baud rate nel mio software seriale è anch'esso impostato su 115200. E sì, il mio software seriale punta alla porta seriale destra.

Cosa mi manca?

risposta

2

trovato la risposta alla mia domanda:

Si scopre biblioteca HardwareSerial.h si basa su interrupt. Questo è qualcosa che viene preso automaticamente cura di te quando si costruisce con l'IDE Arduino. Se non si utilizza l'IDE Arduino (come me), è necessario ricordare di abilitare gli interrupt autonomamente.

Solo #include <avr/interrupt.h> e chiamare sei(); per attivare gli interrupt prima di provare a utilizzare la libreria seriale.

evviva!

2

Probabilmente non è stata inizializzata correttamente la porta UART sul chip. Questo deve essere fatto manualmente per i microcontrollori, e l'IDE di Arduino probabilmente lo stava facendo per te. Controlla la scheda tecnica AVR per il tuo chip, in particolare la sezione della porta seriale.

2

codice colla originale di Arduino si presenta così:

#include <WProgram.h> 
int main(void) 
{ 
    init(); 
    setup(); 
    for (;;) 
     loop(); 
    return 0; 
} 

La roba init() manca nel codice. init() è definito in $ARDUINO_HOME/hardware/arduino/cores/arduino/wiring.c, è possibile collegarlo direttamente o semplicemente copiare il codice di init() nel codice.

Problemi correlati