【问题标题】:Why is no serial data available on my Arduino?为什么我的 Arduino 上没有可用的串行数据?
【发布时间】:2011-09-29 05:28:38
【问题描述】:

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

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

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

我错过了什么?

【问题讨论】:

    标签: c++ arduino avr


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        事实证明 HardwareSerial.h 库依赖于中断。这是使用 Arduino IDE 构建时自动为您解决的问题。如果你不使用 Arduino IDE(像我一样),那么你必须记得自己启用中断。

        在您尝试使用串行库之前,只需 #include &lt;avr/interrupt.h&gt; 并调用 sei(); 以打开中断。

        干杯!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-22
          • 1970-01-01
          相关资源
          最近更新 更多