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 = "";
}
}
}