为什么我的Arduino上没有可用的串行数据?
我在我的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.是的,我的串行软件指向正确的串行端口。
我错过了什么?
找到了答案,以我自己的问题:
原来,HardwareSerial.h库依靠中断。这是在使用Arduino IDE进行构建时自动为您处理的。如果你不使用Arduino IDE(像我一样),那么你必须记住自己启用中断。
只需#include <avr/interrupt.h>
,然后在尝试使用串行库之前调用sei();
打开中断。
干杯!
您可能没有正确初始化芯片上的UART端口。这必须由微控制器手动完成,Arduino IDE可能会为你做。检查你的芯片的AVR数据表,特别是串口部分。
的Arduino的原胶的代码如下所示:
#include <WProgram.h>
int main(void)
{
init();
setup();
for (;;)
loop();
return 0;
}
的init()
东西在你的代码失踪。 init()
在$ARDUINO_HOME/hardware/arduino/cores/arduino/wiring.c
中定义,您可以直接链接它,也可以将init()
的代码复制到您的代码中。