2011-09-29 53 views
6

我在我的Arduino Uno上运行了简单的串行程序,它只是回应你输入的任何内容。在Arduino Sketch IDE(v22)中运行时,此功能非常完美。为什么我的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); 
    } 
} 

(从http://arduino.cc/en/Serial/Available采取代号)

不过,我不喜欢使用Arduino的IDE,宁愿编译我的C++与AVR-G ++代码,所以我写了这个,它应有的功能正是与上面相同:

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

我编译并运行它,但它不起作用。我从来没有看到我的文字回馈给我。我尝试在while(1)循环中输出Serial.available()的值,并且它始终为零。每当我键入键盘时,我都会看到RX LED亮起,但之后没有任何反应。只要条件在Serial.available()以外,我就可以编辑我的代码以成功呼叫Serial.println()

我已确认我的串行软件中的我的baud rate也设置为115200.是的,我的串行软件指向正确的串行端口。

我错过了什么?

回答

2

找到了答案,以我自己的问题:

原来,HardwareSerial.h库依靠中断。这是在使用Arduino IDE进行构建时自动为您处理的。如果你不使用Arduino IDE(像我一样),那么你必须记住自己启用中断。

只需#include <avr/interrupt.h>,然后在尝试使用串行库之前调用sei();打开中断。

干杯!

2

您可能没有正确初始化芯片上的UART端口。这必须由微控制器手动完成,Arduino IDE可能会为你做。检查你的芯片的AVR数据表,特别是串口部分。

2

的Arduino的原胶的代码如下所示:

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

init()东西在你的代码失踪。 init()$ARDUINO_HOME/hardware/arduino/cores/arduino/wiring.c中定义,您可以直接链接它,也可以将init()的代码复制到您的代码中。

相关问题