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


7

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

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

Leider wird mySerial.read () hier nicht zu Ende gehen. 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 an, als ich sie an Port 10 und 11 angeschlossen habe. Daher dachte ich, dass SoftwareSerial den RX- und TX-Port von Arduino so definiert ...)

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 Folgendes ausgeben:

154888143201270341421501588671750825906975101110241005969922864792711629540451369290213140600

Ich kann diese Daten nicht richtig lesen und die Daten nicht auf eine Funktion analysieren, um sie zu verarbeiten, da mySerial.read () nicht beendet wird. 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 viele Daten senden muss. Ich kann nicht zulassen, dass der Benutzer jedes Mal, wenn er Daten sendet, erneut eine Verbindung zum Modul herstellt. Kannst du mir hier raushelfen?


Wenn mir nichts fehlt, müssen Sie nicht einfach am Ende jeder Lesung einen Wagenrücklauf senden? Wenn Sie dann auf dem Arduino feststellen, dass Sie wissen, dass Sie einen vollständigen Messwert haben, können Sie den Puffer für den nächsten Messwert löschen.
PeterJ

Ich habe es versucht und +"\r\n"zu meiner Zeichenfolge hinzugefügt . Dies wird nur eine Pause hinzufügen und nicht aufhörenmySerial.read();
Wolfen

Ich bin nicht sicher, ob dies mit Ihrem Problem zusammenhängt, aber ich würde denken, dass Ihr "while (mySerial.available ())" vor Serial.println enden sollte, andernfalls senden Sie jedes Mal dasselbe String-Objekt erneut neuer Charakter wird hinzugefügt. Und da Sie dies tun, verschwenden Sie möglicherweise Zeit und verpassen möglicherweise einige eingehende Zeichen. Ich gehe davon aus, dass Sie das mySerial lesen möchten, solange es etwas zu lesen gibt, den Wert zu "Daten" hinzufügen und erst am Ende die vollständige Zeichenfolge "Daten" übertragen.
fm_andreas

Ich habe es in die Schleife gesetzt, weil ich testen wollte, ob es "foo" drucken würde oder nicht. Wie Sie sehen können, ist dies nicht der Fall, da es feststeckt. Selbst wenn ich "mySerial.println" ("foo my serial") hinzugefügt habe, wird es nicht gedruckt.
Wolfen

Gibt es "foo my serial" aus, wenn es sich vor der while-Schleife befindet oder sogar in setup ()?
fm_andreas

Antworten:


5
#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 steckt bei mySerial.read () fest; es wird nicht einmal die eingehenden Daten überprüfen für \n...
Wolfen

3

Ich weiß, dass es ein bisschen alt ist, aber ich habe es zum Laufen gebracht.

    #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 = "";
      } 
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.