Problema con puertos serie generados con SoftwareSerial en un Arduino Pro Mini

Saludos. He estado trabajando con un Arduino Pro Mini, en especifico para leer datos de unas barras contadoras de pasajeros y enviar información recolectada a un GPS.

El problema es que al momento de querer generar múltiples puertos serie para leer los datos de las puertas, estos datos no se reciben correctamente. Leí que al momento de generar un puerto serie, se debe usar la función listen() para seleccionar el puerto que va a estar a la escucha de datos. He checado conexiones y todo parece en orden Que creen que podría ser? Hay algún limite con respecto a los puertos serie que un Arduino puede generar?
De antemano, agradezco cualquier ayuda.

Adjunto el código con el que he estado trabajando:

#include <SoftwareSerial.h>

SoftwareSerial GPS(3, 2); // RX, TX GPS
SoftwareSerial mySerial1(5, 4); // RX, TX Puerta 1
SoftwareSerial mySerial2(7, 6); // RX, TX Puerta 2
String cadena = "AT+GTDAT=gv300,2,,";
String datos = "";
String datos2 = "";

void setup() {
  GPS.begin(9600);
  GPS.setTimeout(10);
  delay(300);
  GPS.println("AT+GTDAT=gv300,2,,Q12,0,,,,FFFF$");

  mySerial1.begin(9600);
  mySerial1.setTimeout(10);
  delay(300);

  mySerial2.begin(9600);
  mySerial2.setTimeout(10);
  delay(300);  
}

void loop() {
  mySerial1.listen();
 if(mySerial1.isListening()) { 
 if (mySerial1.available() > 0) {
    datos = String(mySerial1.readString());
    byte buf[datos.length()];
    datos.getBytes(buf, datos.length());
    String datosHex = "";
    for (int i = 0; i < datos.length(); i++) {
      String caracter = String(buf[i], HEX);
      if (caracter.length() < 2) {
        caracter = String("0" + caracter);
      }
      datosHex += caracter;
    }
    datos = datosHex; }
 }
 
 mySerial2.listen();
  if(mySerial2.isListening()){
  if (mySerial2.available() > 0) {
    datos2 = String(mySerial2.readString());
    byte buf[datos2.length()];
    datos2.getBytes(buf, datos2.length());
    String datosHex = "";
    for (int i = 0; i < datos2.length(); i++) {
      String caracter = String(buf[i], HEX);
      if (caracter.length() < 2) {
        caracter = String("0" + caracter);
      }
      datosHex += caracter;
    }
    datos2 = datosHex;
  }
}

if (datos != "") {
    if (datos == "5375626964614e696e6f00" || datos == "5375626964610d00") {
      cadena += "Q1|C1";
      cadena += ",0,,,,FFFF$";
      GPS.println(cadena);
      cadena = "AT+GTDAT=gv300,2,,";
      datos = "";
    } else if (datos == "42616a6164614e696e6f00" || datos == "42616a6164610d00") {
      cadena += "Q2|C1";
      cadena += ",0,,,,FFFF$";
      GPS.println(cadena);
      cadena = "AT+GTDAT=gv300,2,,";
      datos = "";
    } else if (datos == "426c6f7175656f0d00" || datos == "426c6f7175656f" || datos == "426c6f7175656f00") {
      cadena += "Q4|C1";
      cadena += ",0,,,,FFFF$";
      GPS.println(cadena);
      cadena = "AT+GTDAT=gv300,2,,";
      datos = "";
    } else if (datos == "50412e424c4f00") {
      cadena += "Q15|C1";
      cadena += ",0,,,,FFFF$";
      GPS.println(cadena);
      cadena = "AT+GTDAT=gv300,2,,";
      datos = "";
    } else {
      cadena += "Q13|";
      cadena += datos;
      cadena += ",0,,,,FFFF$";
      GPS.println(cadena);
      cadena = "AT+GTDAT=gv300,2,,";
      datos = "";
    }
  }

  if (datos2 != "") {
    if (datos2 == "5375626964614e696e6f00" || datos2 == "5375626964610d00") {
      cadena += "Q1|C2";
      cadena += ",0,,,,FFFF$";
      GPS.println(cadena);
      cadena = "AT+GTDAT=gv300,2,,";
      datos2 = "";
    } else if (datos2 == "42616a6164614e696e6f00" || datos2 == "42616a6164610d00") {
      cadena += "Q2|C2";
      cadena += ",0,,,,FFFF$";
      GPS.println(cadena);
      cadena = "AT+GTDAT=gv300,2,,";
      datos2 = "";
    } else if (datos2 == "426c6f7175656f0d00" || datos2 == "426c6f7175656f" || datos2 == "426c6f7175656f00") {
      cadena += "Q4|C2";
      cadena += ",0,,,,FFFF$";
      GPS.println(cadena);
      cadena = "AT+GTDAT=gv300,2,,";
      datos2 = "";
    } else if (datos2 == "50412e424c4f00") {
      cadena += "Q15|C2";
      cadena += ",0,,,,FFFF$";
      GPS.println(cadena);
      cadena = "AT+GTDAT=gv300,2,,";
      datos2 = "";
    } else {
      cadena += "Q13|";
      cadena += datos2;
      cadena += ",0,,,,FFFF$";
      GPS.println(cadena);
      cadena = "AT+GTDAT=gv300,2,,";
      datos2 = "";
    }
  }
}

Saludos

El código está muy enmarañado y absolutamente carente de comentarios, lleno de palabras mágicas y es muy imposible saber qué hace.

¿por qué no nos dices qué quieres decir con que no se recibe correctamente y qué es lo que efectivamente sucede?

A ver, y porque te complicas la vida usando un dispositivo que no tiene multiples puertos cuando hay otros que si los tienen?

Usa un MEGA, un DUE por citar los mas comunes.

Tienen 4 puertos físicos no virtuales.
No vas a perder nada con ellos. Son mas grandes cierto pero estas cosas se resuelven rápidamente.
No pierdas tiempo con un arduino que no tiene puertos.

@surbyte
Quería intentarlo con un Pro Mini por cuestiones de espacio, pero ya use un Mega y con un poco de modificaciones todo funcionó perfectamente. Gracias por responder.
Gracias por responder.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.