Arduino: Was ist der beste Weg, um Daten mit SoftwareSerial zu empfangen und zu lesen?

Ich habe Arduino mit einem HC-06 Bluetooth-Modul verbunden.

Ich möchte Daten von einer Android-Anwendung, die ich geschrieben habe, an den Arduino senden und Arduino abhängig von den empfangenen Daten Dinge tun lassen. Bisher sende ich Integer-Werte zwischen 0 und 1024.

Leider endet mySerial.read() hier nicht. Es liest die Daten als eine große Zeichenfolge.

Meine Module RX- und TX-Pin sind mit meinem Arduinos RX- und TX-Pin verbunden. (Die Konsole zeigte keine Daten, als ich sie an Port 10 und 11 anschloss, also dachte ich, SoftwareSerial definiert so den RX- und TX-Port von Arduino ...)

Meine Skizze:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
char character;
void setup()  
{
  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);

}
void loop() // run over and over
{
    String Data = "";
    while(mySerial.available()) {
     character = mySerial.read();
     Data.concat(character);
    // Serial.println(Data);
     Serial.println("foo");
    }

Dies wird ausgeben:

154888143201270341421501588671750825906975101110241005969922864792711629540451369290213140600

Ich kann diese Daten nicht richtig lesen und ich kann die Daten nicht an eine Funktion parsen, um sie zu verarbeiten, weil mySerial.read() nicht zu Ende geht. Es muss einen besseren Weg geben, diese Daten zu empfangen oder zu senden.

Meine Bluetooth-Ausgangsstromquelle:

public void sendPWM(int progress) {
            OutputStream tmpOut = null;
            try {
                tmpOut = mmSocket.getOutputStream();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                Log.e("error", "NO OUTPUT STREAM", e);
                e.printStackTrace();
                return;
            }

            try {
                // byte[] buffer = stringToBytesUTFCustom("1");

                byte[] buffer = String.valueOf(progress).getBytes();
                tmpOut.write(buffer);

                // tmpOut.flush(); /*I have turned this ON and OFF, to see if it
                // makes any difference*/

            } catch (IOException e) {
                // TODO Auto-generated catch block
                Log.e("error", "EXCEPTION DURING WRITE", e);
                e.printStackTrace();
            }

        }

Ich schließe den outputStream nicht, da dadurch auch die Verbindung zum HC-06 abgebrochen wird und ich sehr viele Daten senden muss. Ich kann nicht zulassen, dass sich der Benutzer jedes Mal neu mit dem Modul verbindet, wenn er Daten sendet. Können Sie mir hier weiterhelfen?

Wenn ich nicht etwas vermisse, müssen Sie nicht einfach am Ende jeder Lesung einen Wagenrücklauf senden? Dann auf dem Arduino, wenn Sie wissen, dass Sie einen vollständigen Messwert haben und den Puffer als nächstes für den nächsten Messwert löschen können.
Ich versuchte es und fügte +"\r\n"meiner Zeichenfolge hinzu. Dies fügt nur eine Pause hinzu und hört nicht aufmySerial.read();
Ich bin mir nicht sicher, ob dies mit Ihrem Problem zusammenhängt, aber ich würde denken, dass Ihr "while (mySerial.available ())" vor Serial.println enden sollte, da Sie sonst jedes Mal dasselbe String-Objekt erneut senden a neuer Charakter wird hinzugefügt. Und da Sie das tun, verschwenden Sie möglicherweise Zeit und verpassen dadurch möglicherweise einige eingehende Zeichen. Ich nehme an, Sie möchten mySerial lesen, solange es etwas zu lesen gibt, den Wert zu "Data" hinzufügen und erst am Ende die vollständige "Data" -Zeichenfolge übertragen.
Ich habe es in die Schleife gesteckt, weil ich testen wollte, ob es "foo" ausgeben würde oder nicht. Wie Sie sehen können, tut es das nicht, da es feststeckt. Selbst wenn ich ` mySerial.println("foo my serial");` hinzugefügt habe, wird es nicht gedruckt.
Gibt es "foo my serial" aus, wenn es vor der while-Schleife oder sogar in setup() steht?

Antworten (2)

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX
String Data = "";

void setup()  
{
    mySerial.begin(9600);
}

void loop() // run over and over
{
    while (mySerial.available())
    {
        char character = mySerial.read(); // Receive a single character from the software serial port
        Data.concat(character); // Add the received character to the receive buffer
        if (character == '\n')
        {
            Serial.print("Received: ");
            Serial.println(Data);

            // Add your code to parse the received line here....

            // Clear receive buffer so we're ready to receive the next line
            Data = "";
        }
    }
}
Funktioniert nicht. Es bleibt bei mySerial.read (); es prüft nicht einmal die eingehenden Daten auf \n...

Ich weiß, es ist ein bisschen alt, aber ich habe es funktioniert.

    #include <SoftwareSerial.h>

    SoftwareSerial mySerial(10, 11); // RX, TX
    String data = "";

    void setup()  
    {
        mySerial.begin(9600);
    }

    void loop() // run over and over
    {
      while(mySerial.available()==0)
      {}

      char character;
      while(mySerial.available()>0)
      {
        character = mySerial.read();
        mySerial.write(character);
      }

      data += character;

      if (character == 13) {  
        mySerial.print("Received: ");
        mySerial.println(data);
        data = "";
      } 
    }