当通过rx引脚接收数据时如何中断arduino

时间:2014-01-25 01:23:02

标签: c bluetooth arduino

what am I doing wrong ? I have the RX of the Bluetooth HC-07 wired into pin2 looking for a change in voltage when data is received to start a interrupt. 

I'm trying to cause an interrupt when data is received via the Bluetooth.     


    #include <SoftwareSerial.h>// import the serial library
    #include <PinChangeInt.h>


    SoftwareSerial Genotronex(10, 11); // RX, TX
    int ledpin=13; // led on D13 will show blink on / off
    int BluetoothData; // the data given from Computer
    void doSomething(void);

    void setup() {
      // wil run once
      Genotronex.begin(9600);// data rate for comunicating 
      Genotronex.println("Bluetooth On please press 1 or 0 blink LED ..");
      pinMode(ledpin,OUTPUT);


      interrupts();
      pinMode(2,INPUT);
      attachInterrupt(0,doSomething,  CHANGE);
    }

    void loop() {
      // Main body of code


    }



    void doSomething(){
     Genotronex.println("INTERRUPT!!!!!!!!!!!!");

    digitalWrite(ledpin,1);
    delay(1000);
    digitalWrite(ledpin,0);
    delay(1000);

    detachInterrupt(0);

    }

////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////

这是代码的重新发布,我已经取出了评论所说的内容,并在大多数情况下添加了您推荐的内容。代码运行但改变状态永远不会改变它只改变一次?我试过取出DetachInterrupt,但实际的中断停止工作呢?还有什么想法吗?感谢您的帮助btw

#include <SoftwareSerial.h>// import the serial library



SoftwareSerial Genotronex(10, 11); // RX, TX
int ledpin=13; // led on D13 will show blink on / off
int BluetoothData; // the data given from Computer
void doSomething(void);
volatile int state = LOW;


void setup() {
  // wil run once
  Genotronex.begin(9600);// data rate for comunicating 
  Genotronex.println("Bluetooth On please press 1 or 0 blink LED ..");
  pinMode(ledpin,OUTPUT);



  pinMode(2,INPUT);
  attachInterrupt(0,doSomething,  CHANGE);
}

void loop() {
  // Main body of code
digitalWrite(ledpin, state);

}



void doSomething(){

Genotronex.println("INTERRUPT!!!!!!!!!!!!");



 state = !state;



detachInterrupt(0);

}

1 个答案:

答案 0 :(得分:0)

删除: detachInterrupt(0);

如果您可以将中断从CHANGE更改为HIGH / LOW并添加“debouncing”之类的内容。我的版本(HIGH状态中断):

void interruptfunction() { 

      //your interrupt code here

  while(1){
    if (digitalRead(2)==LOW){
      delay(50);
      if (digitalRead(2)==LOW) break;
    }
  }
}

或者:(未经测试)

void interruptfunction() { 

      //your interrupt code here

  if (digitalRead(2)==HIGH) state=true;
  else state=false;

  while(1){
    if (digitalRead(2)!=state){
      delay(50);
      if (digitalRead(2)!=state) break;
    }
  }
}

如果您必须对CHANGE做出反应,请尝试离开detachInterrupt(0);,但请将其重新挂接到主循环中的某个位置。