TimerOne和串行库
我正在使用,代码如下所示:TimerOne和串行库,timer,arduino,atmega,Timer,Arduino,Atmega,我正在使用,代码如下所示: #include <TimerOne.h> void setup() { Serial.begin(9600); pinMode(13, OUTPUT); Serial.println(); Timer1.initialize(1000000); // set a timer of length 1000000 microseconds Timer1.attachInterrupt(timerIsr); /
#include <TimerOne.h>
void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
Serial.println();
Timer1.initialize(1000000); // set a timer of length 1000000 microseconds
Timer1.attachInterrupt(timerIsr); // attach the service routine here
}
void loop() {
Serial.println(millis());
}
void timerIsr() {
Serial.print("FROM Time1: ");
Serial.println(millis());
}
作者:
工作正常,我认为arduino的串行库在使用中断时会出现一些问题,有可能吗
有任何方法可以在某些代码块中阻止arduino,我尝试使用,但没有成功
我正在使用Arduino UNO(ATmega328)第一个问题是您的ISR(中断服务例程),不能执行任何IO。 而是写一些东西,比如:
int timedone;
setup() {
// etc.
timedone = 0;
}
loop() {
if (timedone == 1)
{
Serial.print("FROM Time1: ");
Serial.println(millis());
}
}
void timerISR() {timedone = 1;}
而不是你所拥有的:
void timerIsr() {
Serial.print("FROM Time1: ");
Serial.println(millis());
}
希望这有帮助。我花了很多时间去发现 只是
:/显然有两个问题:从ISR发出IO和不刷新串行缓冲区?缓冲区填满后会自动刷新。是的,但我不知道为什么,但是当我在ISR和Loop()中刷新串行缓冲区时效果很好:Dtry刷新只是在Loop()中,而不是在ISR中。作为一种良好的编程实践,ISR不应执行I/O(printf等),最终当您遇到ISR I/O问题时,您的代码将变得足够复杂。谢谢您的提示:D
int timedone;
setup() {
// etc.
timedone = 0;
}
loop() {
if (timedone == 1)
{
Serial.print("FROM Time1: ");
Serial.println(millis());
}
}
void timerISR() {timedone = 1;}
void timerIsr() {
Serial.print("FROM Time1: ");
Serial.println(millis());
}
Serial.flush();