Bluetooth + Interrupt

Servus :slight_smile:

gibts eine Möglichkeit den Bluetooth Empfang mit einem Interrupt zu verknüpfen?

Ich nutze BT mit SoftwareSerial pin 10 und 11 (rx,tx). Arduino ATMega 2560R3 von Elegoo

Hab jetzt schon bissl probiert aber wenn ich auf einen Interrupt Pin umstecke bekomm ich keine BT Daten mehr und wenn ich BT Daten bekomme löst kein Interrupt aus.

Hab keinen Bock in meinem Code ständig per Hand abfragen zu müssen ob Daten vorhanden sind.
Gibts evtl. ne Art Multithreading wo ich die abfrage auslagern könnte?

Beschreibe doch mal etwas genauer, was du machen möchtest und was der Interrupt dann erreichen soll.

Sobald ich aus meiner App Daten ans Arduino schicke soll im Arduino ein Interrupt ausgelöst werden, die Daten gelesen und verarbeitet werden.

Warum über Interrupt? Weil das Arduino durchgehend diverse unterschiedliche Sachen abarbeitet. Es ist nie in einem Idle Modus wo es sich nur drum kümmert ob Daten ankommen. Deswegen wär Interrupt super weil ich ansonsten an allen Ecken und Enden per Hand Prüfen muss ob Daten von der App geschickt wurden.

Dann müsste dein BT-Modul ein Signal ausgeben, welches du zum Auslösen des IRQ nutzen kannst.

du musst im loop doch nur einmal prüfen ob daten vorhanden sind und in den puffer einlesen. unter Umständen auch nur pro loop nur ein byte einlesen.

harryberlin:
du musst im loop doch nur einmal prüfen ob daten vorhanden sind und in den puffer einlesen. unter Umständen auch nur pro loop nur ein byte einlesen.

Das ist doch genau das, was der TO nicht will.

harryberlin:
du musst im loop doch nur einmal prüfen ob daten vorhanden sind und in den puffer einlesen. unter Umständen auch nur pro loop nur ein byte einlesen.

Wenns bloß so einfach wär :smiley:

Hab paar tausend Zeilen über viele Klassen verteilt und an sehr vielen unterschiedlichen Stellen kanns sein ich was unterbrechen muss wenn neue BT Daten da sind.

ist das byte zum interrupt den schon komplett? d.h. es muss trotzdem geprüft werden.

ggf. kann man den rx pin auf nen interrupt pin splitten.

Oder du nimmst einen ATtiny85 für den BT und verbindest den per I2C mit deinem Arduino. Da kannst du einen IRQ auf einem zusätzlichen Draht mitschicken.

lancedelgardo:
Wenns bloß so einfach wär :smiley:

Hab paar tausend Zeilen über viele Klassen verteilt und an sehr vielen unterschiedlichen Stellen kanns sein ich was unterbrechen muss wenn neue BT Daten da sind.

Bau endliche Automaten.
Verwende kooperatives Multitasking.
Dann enden die Schmerzen.

Hi

void serialEvent(){
  //mache was mit den frischen seriellen Daten
}

Oder wo biege ich falsch ab?

MfG

Oder wo biege ich falsch ab?

Hat SoftSerial sowas?

Auch ist das kein Interrupt, sondern wird vor jedem Loop Aufruf ausgeführt.

Ich nutze BT mit SoftwareSerial pin 10 und 11 (rx,tx). Arduino ATMega 2560R3 von Elegoo

Wobei ich bei einem Mega wohl nie Softserial nutzen würde.
Die 4 Hardware Serial müssten doch eigentlich reichen.

Hi

  • Gute Frage
  • Gut zu wissen ... quasi ein 'If (serial.available()) serialEvent();'

Gibt's irgendwo eine Übersicht, wo diese ganzen Gemeinheiten aufgelistet sind?
(... ok, eigentlich wollte ich wissen, WO Das gelistet ist - die Existenz Dessen nehme ich Mal stark an)

Danke Dir für die Gegenfrage - Die ich Dir aber nicht wirklich beantworten kann.
Dann wäre die IF-Zeile ein 'Zumindest könnte SoftSerial so was haben'.

MfG

postmaster-ino:
Gibt's irgendwo eine Übersicht, wo diese ganzen Gemeinheiten aufgelistet sind?

Du musst doch nur mal in den Quellcode schauen. Das ist kein Geheimnis:

main.cpp

int main(void)
{
       ...
 
 setup();
    
 for (;;) {
 loop();
 if (serialEventRun) serialEventRun();
 }
        
 return 0;
}

Und HardwareSerial.cpp

void serialEventRun(void)
{
#if defined(HAVE_HWSERIAL0)
  if (Serial0_available && serialEvent && Serial0_available()) serialEvent();
...
}

serialEvent() und serialEventRun() sind als weak deklariert. Also wird nur gelinkt wenn es auch definiert ist. Ansonsten ist es 0 und wird damit nicht ausgeführt

Ne, SoftwareSerial hat diese Funktion nicht, muss man sich selbst drum kümmern.
Ist aber auch kein Hexenwerk.

Nur das ist nicht das, was der TO will.
Ist ihm zu aufwändig. Naja muss man so hinnehmen.

lancedelgardo:
Sobald ich aus meiner App Daten ans Arduino schicke soll im Arduino ein Interrupt ausgelöst werden, die Daten gelesen und verarbeitet werden.

Ich glaube, Du hast nicht richtig verstanden, wie Interrupts funktionieren. Die ersetzen kein Multitasking Betriebssystem. Du kannst in einem Interrupt nicht die Daten des BT komplett lesen und verarbeiten. Das musst Du sowieso im loop() machen.

Außerdem ist die serielle Kommunikation sehr langsam. Ein Zeichen braucht 1 / Baudrate * 10 Sekunden. Der Prozessor ist viel, viel schneller und man kann zwischen den Zeichen andere Dinge tun. Ich sehe nicht wieso man da sofort auf eintreffende Daten reagieren müsste