我在我的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.是的,我的串口软件指向正确的串口.
我错过了什么?
找到了我自己的问题的答案:
事实证明,HardwareSerial.h 库依赖于中断。当使用 Arduino IDE 进行构建时,系统会自动为您处理这些事情。如果您不使用 Arduino IDE(像我一样),那么您必须记住自行启用中断。
只需#include <avr/interrupt.h>,然后sei();在尝试使用串行库之前调用即可打开中断。
干杯!
| 归档时间: |
|
| 查看次数: |
3229 次 |
| 最近记录: |