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();