2011-09-29 20 views
6

He ejecutado el sencillo programa en serie en mi Arduino Uno, que simplemente echos lo que escribes. Esto funciona perfectamente cuando se ejecuta en Arduino Sketch IDE (v22).¿Por qué no hay datos seriales disponibles en mi 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); 
    } 
} 

(Código tomado de http://arduino.cc/en/Serial/Available)

Sin embargo, prefiero no utilizar el IDE de Arduino y preferiría compilar mi código C++ con avr-g ++, así que escribí esto, que debería funcionar exactamente el mismo que el anterior:

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

me compilar y ejecutar, pero no funciona. Nunca veo mi mensaje de eco en mi memoria. Intenté imprimir el valor de Serial.available() en el lazo while(1), y siempre es cero. Cada vez que escribo en el teclado, veo que el LED RX se enciende, pero no pasa nada después de eso. Puedo editar mi código para llamar con éxito al Serial.println() siempre que esté fuera del condicional Serial.available().

He confirmado que mi baud rate en mi software de serie también está configurado en 115200. Y sí, mi software de serie apunta al puerto serie correcto.

¿Qué me estoy perdiendo?

Respuesta

2

encontrado la respuesta a mi propia pregunta:

Resulta que la biblioteca se basa en HardwareSerial.h interrupciones. Esto es algo que se cuida automágicamente cuando construye con el IDE de Arduino. Si no está utilizando Arduino IDE (como yo), debe recordar activar las interrupciones por su cuenta.

Solo #include <avr/interrupt.h>, y llame al sei(); para activar las interrupciones antes de intentar usar la Biblioteca serie.

¡salud!

2

Probablemente no haya inicializado correctamente el puerto UART en el chip. Esto tiene que hacerse manualmente para microcontroladores, y el Arduino IDE probablemente lo esté haciendo por usted. Consulte la hoja de datos de AVR para su chip, específicamente la sección del puerto serie.

2

código de unión original del Arduino se ve así:

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

El material init() no se encuentra en el código. init() se define en $ARDUINO_HOME/hardware/arduino/cores/arduino/wiring.c, puede enlazar directamente o simplemente copiar el código de init() en su código.

Cuestiones relacionadas