为什么我的Arduino上没有可用的串行数据?

时间:2011-09-29 05:28:39

标签: c++ arduino avr

我在我的Arduino Uno上运行了简单的串行程序,它只是回显你输入的内容。在Arduino Sketch IDE(v22)中运行时,这非常有效。

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而宁愿用avr-g ++编译我的C ++代码,所以我写了这个,它应该与上面的完全相同

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

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

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

我错过了什么?

3 个答案:

答案 0 :(得分:3)

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

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

代码中缺少init()内容。 init()中定义了$ARDUINO_HOME/hardware/arduino/cores/arduino/wiring.c,您可以直接与其关联,也可以将init()的代码复制到您的代码中。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

找到我自己的问题的答案:

事实证明,HardwareSerial.h库依赖于中断。在使用Arduino IDE构建时,这是为您自动处理的事情。如果您没有使用Arduino IDE(像我一样),那么您必须记住自己启用中断。

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

喝彩!