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

Fin*_*ner 6 c++ avr arduino

我在我的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

(代码来自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;
}
Run Code Online (Sandbox Code Playgroud)

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

我已经确认我的串口软件中的波特率也设置为115200.是的,我的串口软件指向正确的串口.

我错过了什么?

Fin*_*ner 2

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

事实证明,HardwareSerial.h 库依赖于中断。当使用 Arduino IDE 进行构建时,系统会自动为您处理这些事情。如果您不使用 Arduino IDE(像我一样),那么您必须记住自行启用中断。

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

干杯!