Arduino: ¿Cuál es la mejor manera de recibir y leer datos con SoftwareSerial?

7

Tengo Arduino conectado a un módulo bluetooth HC-06.

No deseo enviar datos desde alguna aplicación de Android que escribí al Arduino y dejé que Arduino hiciera cosas dependiendo de los datos recibidos. Hasta ahora estoy enviando valores enteros entre 0 y 1024.

Lamentablemente, mySerial.read () no terminará aquí. Lee los datos como una cadena grande.

Mis módulos RX y TX están conectados a mi Arduinos RX y TX. (La consola no mostró ningún dato cuando los conecté a los puertos 10 y 11, así que pensé que así es como SoftwareSerial define el puerto RX y TX de Arduino ...)

Mi Sketch:

#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");
    }

Esto dará como resultado:

154888143201270341421501588671750825906975101110241005969922864792711629540451369290213140600

No puedo leer estos datos correctamente y no puedo analizar los datos de alguna función para manejarlos, porque mySerial.read () no llegará a su fin. Debe haber una mejor manera de recibir o enviar estos datos.

Mi fuente de flujo de salida Bluetooth:

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();
            }

        }

No cierro el outputStream, porque esto también cancelará la conexión con el HC-06 y tengo que enviar muchos datos. No puedo dejar que el usuario vuelva a conectarse al módulo cada vez que envía datos. ¿Puedes ayudarme aquí?

    
pregunta Wolfen

2 respuestas

3
#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 = "";
        }
    }
}
    
respondido por el user30163
3

Sé que es un poco viejo, pero lo tengo funcionando.

    #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 = "";
      } 
    }
    
respondido por el weasel

Lea otras preguntas en las etiquetas