5

我正在做一个 Arduino Mega 2560 项目。在 Windows 7 PC 上,我使用的是 Arduino1.0 IDE。我需要建立一个波特率为 115200 的串行蓝牙通信。当数据在 RX 可用时,我需要接收中断。我见过的每段代码都使用“轮询”,即在 Arduino 的循环中放置一个 Serial.available 条件。如何在 Arduino 循环中为中断及其服务程序替换这种方法?似乎 attachInterrupt() 没有提供此目的。我依靠中断将 Arduino 从睡眠模式唤醒。

我开发了这个简单的代码,它应该打开连接到引脚 13 的 LED。

    #include <avr/interrupt.h> 
    #include <avr/io.h> 
    void setup()
    {
       pinMode(13, OUTPUT);     //Set pin 13 as output

       UBRR0H = 0;//(BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register 
       UBRR0L = 8; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register 
       UCSR0C |= (1 << UCSZ00) | (1 << UCSZ10); // Use 8-bit character sizes 
       UCSR0B |= (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);   // Turn on the transmission, reception, and Receive interrupt      
    }

    void loop()
    {
      //Do nothing
    }

    ISR(USART0_RXC_vect)
    {    
      digitalWrite(13, HIGH);   // Turn the LED on          
    }

问题是子程序永远不会被服务。

4

3 回答 3

7

最后我发现了我的问题。我将中断向量“USART0_RXC_vect”更改为USART0_RX_vect. 我还添加interrupts();了启用全局中断,它工作得很好。

代码是:

#include <avr/interrupt.h> 
#include <avr/io.h> 
void setup()
{
   pinMode(13, OUTPUT); 

   UBRR0H = 0; // Load upper 8-bits of the baud rate value into the high byte of the UBRR register 
   UBRR0L = 8; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register 
   UCSR0C |= (1 << UCSZ00) | (1 << UCSZ10); // Use 8-bit character sizes 
   UCSR0B |= (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);   // Turn on the transmission, reception, and Receive interrupt      
   interrupts();
}

void loop()
{

}

ISR(USART0_RX_vect)
{  
  digitalWrite(13, HIGH);   // set the LED on
  delay(1000);              // wait for a second
}

感谢您的回复!!!!

于 2012-04-19T02:54:59.767 回答
2

您是否尝试过该代码但它不起作用?我认为问题在于您没有打开中断。您可以尝试调用sei();interrupts();在您的setup函数中。

于 2012-04-18T14:25:16.927 回答
-1

就在UBRR0L = 8这之后:

 UCSR0C |= (1 << UCSZ00) | (1 << UCSZ01);

改为:

 UCSR0C |= (1 << UCSZ00) | (1 << UCSZ10);
于 2019-01-26T18:13:19.200 回答