我在我的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.是的,我的串行软件指向正确的串口。
我错过了什么?
答案 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();
打开中断。
喝彩!