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?
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.
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.
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
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.
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.
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.
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'.
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
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