2017-06-10 2 views
-1

Je souhaite utiliser la broche RX matérielle d'Arduino comme broche d'interruption. Si des données sont disponibles sur la broche RX, un signal d'interruption sera généré, appelez une fonction de rappel pour lire les données série entrantes. Je ne veux pas que la lecture de la fonction loop() soit constante sur le port série. J'utilise ce code mais mon interruption n'est pas déclenchée. J'ai également essayé en enlevant digitalPintointerrupt() mais n'obtenant aucune réponse.Utiliser la broche RX matérielle comme broche d'interruption d'arduino

`#include <SoftwareSerial.h> 
const byte interruptPin = 0;//In arduino MEGA RX 19. TX 18 
String msg = "";//Incomming message 
#define Line_RX 3 //UART RX 
#define Line_TX 2 //UART TX 

SoftwareSerial mySerial (Line_TX, Line_RX); //initialize software serial 

void setup() { 
    // put your setup code here, to run once: 
    Serial.begin(19200); 
    mySerial.begin(19200); 
    attachInterrupt(digitalPinToInterrupt(interruptPin), serial_read, HIGH); 
}//end setup 

void loop() { 
    // put your main code here, to run repeatedly: 
}//end loop 

void serial_read(){ 

    char _bite; 
    sei();//Disable hardware interrupts for a moment 
    while(Serial.available()>0){ 
    delay(1);//Do not delete this delay 
    if(Serial.available()>0){ 
     _bite = (char)Serial.read(); 
     msg += _bite; 
     if(_bite == '\n'){ 
     mySerial.print(msg);//Do what you print your message 
     msg = "";//Clean message for new one 
     break; 
     }//end if 
    }//end if 
    }//end while 
    cli();//re-enabling hardware interrupts 
}//en 

d serial_read`

Répondre

0

sei() PERMET interruptions, tandis que cli() les désactive. Vos commentaires suggèrent que vous les avez en arrière. Il y a peut-être d'autres problèmes, mais ces instructions ne correspondent certainement pas à vos intentions.

Si vous souhaitez obtenir de plus bas niveau, pensez à un design pur déclenché par interruption comme:

ISR (USART0_UDRE_vect) 
{ 
    // Send next byte and increment pointer 
    UDR0 = *ub_outptr++; 
    // Pointer wrapping 
    if (ub_outptr >= UART_buffer + BUFF_SIZE) 
    ub_outptr = UART_buffer; 
    // If buffer is empty: disable interrupt 
    if(--ub_buffcnt == 0) 
    UCSR0B &= ~(1 << UDRIE0); 

}

Je sais que cela vous emmène hors de la substance de la bibliothèque Arduino, donc cela peut ne pas soyez idéal pour vous. Mais cela fonctionne (l'exemple est pour l'envoi de données, car j'ai un projet actif où le microcontrôleur envoie des données à un écran LCD, juste un exemple dans AVR-GCC C.)

+0

J'ai écrit une instruction d'impression au début mais je ne suis pas en mesure d'entrer la fonction de rappel. Si j'utilise le logiciel série (broche 2,3 comme TX, RX) et l'utiliser comme broche d'interruption, alors la fonction de rappel appelée 2 fois pour chaque octet. mais je ne suis pas en mesure d'appeler la fonction de rappel avec le matériel série –

+0

Je ne suis pas sûr de savoir comment vous diriger à procéder. Je conçois des conceptions de métal nu plus souvent que des conceptions basées sur Arduino. Mais un rapide coup d'œil sur votre code et les instructions 'cli' et' sei' avec des commentaires qui impliquent exactement le contraire ont attiré mon attention, c'est tout. Toutes mes conceptions de série utilisent la transmission et la réception par interruption comme indiqué dans ma réponse éditée. – TomServo

+0

Désolé pour l'erreur, je dois écrire cli() pour désactiver l'interruption. Mais je ne suis toujours pas capable d'appeler ma fonction de rappel. Si j'utilise le logiciel série, broche no (2,3) comme tx et rx, alors je suis capable d'appeler ma fonction de rappel. –

0

Essayez mon NeoHWSerial. C'est une version modifiée de la classe noyau Arduino, HardwareSerial, la classe utilisée pour Serial, Serial1, etc. Elle ajoute la possibilité d'enregistrer un rappel pour chaque caractère reçu.