Unterprogramme bei Bluetoothverbindung

Hey Leute,
ich hab mein Arduino über das HC-06 Bluetooth Modul mit meim Android Handy verbunden.
Mit dem Beisielprogramm ‘SoftwareSerialExample’ kann ich auch schon Daten hin und her schicken.

Sobald ich allerdings bestimmte int oder char Werte schicke, diese auslese, sodas das Arduino Unterprogramme durchläuft, bricht alles zusammen.

Meine Frage also:
Wie kann ich im Arduino durch bestimmte Werte, Unterprogramme durchlaufen ohne die syncronisation zu verlieren, sodass die Kommunikation zwischen Handy und Arduino nicht zusammenbricht.

Als Beispiel (baut auf ‘SoftwareSerialExample’ auf):

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);

Serial.println(“Goodnight moon!”);

// set the data rate for the SoftwareSerial port
mySerial.begin(9600);
mySerial.println(“Hello, world?”);
}

void loop() // run over and over
{
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());

if(mySerial.read() == ‘1’)
prog1();

if(mySerial.read() == ‘2’)
prog2();

if(mySerial.read() == ‘3’)
prog3();

}

Gruß

if(mySerial.read() == '1') prog1();

if(mySerial.read() == '2') prog2();

if(mySerial.read() == '3') prog3();

Für sowas ließt man nur einmal ein. Ansonsten geht das nicht. Des weiteren ist hier ein switch besser.

Abgesehen dürfte er Sketch so nicht lauffähig sein. Lerne die Basics und schau vor allem, wo man wie { } setzt.

sschultewolter:
Lerne die Basics und schau vor allem, wo man wie { } setzt.

Bezüglich der geschweiften Klammern habe ich jetzt kein Problem erkennen können, die if-Anweisungen
verweisen nur auf die jeweiligen Funktionen. Wenn nur diese aufgerufen werden, muss man keine Blöcke über { } definieren. Oder habe ich was übersehen? Natürlich muss es die Funktionen progx() auch geben.
Dazu noch am Rande: Das beharrliche “Lerne die Basics.” hilft einem Anfänger herzlich wenig, denn diese Formulierung gibt keine Richtung vor, wonach man konkret suchen soll. Daher lieber: “Das Erstellen eines nicht blockierenden Codes gehört zu den Grundlagen einer guten Programmierung.” (Liegt vielleicht auch daran, dass ich das Wort “Basics” verabscheue.) :wink:

Aber bevor ich weiter abschweife:

LocDog:
Sobald ich allerdings bestimmte int oder char Werte schicke, diese auslese, sodas das Arduino Unterprogramme durchläuft, bricht alles zusammen.

Was bricht denn zusammen? Hier solltest du konkreter werden. Dein Programm, wenngleich auch auf einem Beispiel basierend, liest sowieso nur byteweise. Dass du ohne weitere Bearbeitung weder Integer-Werte noch Character(-Arrays) auswerten kannst, wundert mich also gar nicht.

Und ansonsten bitte auch die Code-Tags verwenden, um das alles leserlich zu gestalten.

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);



  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
  mySerial.println("Hello, world?");
}

Die SoftwareSerial Libary ist nicht wirklich dafür bekannt, gut zu sein. Da sind selbst Baudraten von 9600 teilweise schon kritisch. Das nur so am Rande, bessere wäre, auf die AltSoftSerial auszuweichen.

void loop() // run over and over
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
  
   
   if(mySerial.read() == '1')
     prog1();
   
   if(mySerial.read() == '2')
     prog2();
     
   if(mySerial.read() == '3')
     prog3();

}

Hier sehe ich die größeren Probleme, und wundere mich ein bisschen, das überhaupt was geht.

Das Beispiel, dass die empfangenen Zeichen bei der Schnittstelle ausgeben werden, kann man machen, aber besser nicht so.
Sinnvoller ist es, solange einzulesen, bis eine bestimmte Anzahl an Zeichen am UART angekommen ist. Das wäre in diesem Fall jenach Betriebssystem und Einstellung des Terminals mindestens 2 Zeichen. (LF und/oder LF/CR + Zeichen)
Erst wenn dieser Vorgang abgeschlossen ist, wird den anderen Funktionen der Wert zu Verfügung gestellt.

Das Problem bei deinen 3 weiteren Serial Aufrufen ist vollgendes. prog1 wird nur ausgeführt, wenn ein ankommendes Zeichen ‘1’ ist, andernfalls wird es ausgelesen, aber nicht weiter verwendet.
Prog2 wird ausgeführt, wenn die Abfrage zu Prog1 bereits einen Wert gerade gehalt hat. Hier kommt somit nur das 2. Zeichen an …

Wie gesagt, lese erst eine vollständige Zeichenkette ein, bis ‘\n’ vorkommt oder eine gewissen Anzahl an Zeichen gesendet wurden.

Normalerweise liefert mySerial.read() den int-Wert -1 zurück. (ausser es wurde schon etwas gesendet)

Wenn du entweder '1' oder '2' erwartest, darfst du natürlich nicht zwei mal read() aufrufen, denn alles was schon mal gelesen wurde, ist danach weg.

Das Problem hat übrigens nichts mit Bluetooth zu tun, eher (aber vermutlich noch nicht mal) mit SoftwareSerial.

"Das Erstellen eines nicht blockierenden Codes gehört zu den Grundlagen einer guten Programmierung."

... ist auch kein wesentlich hilfreicherer Tip als "Lerne die Basics" ;) Lass dich auf jeden Fall nicht abschrecken :P