// Se declaran variables tipo String para almacenar cadenas de texto.
String cadena; // Aquí almacenaremos la cadena completa que recibamos.
String dato1; // Almacena el primer dato extraído de la cadena.
String dato2; // Almacena el segundo dato extraído de la cadena.
String dato3; // Almacena el tercer dato extraído de la cadena.
String dato4; // Almacena el cuarto dato extraído de la cadena.
String dato5; // Almacena el quinto dato extraído de la cadena.
String dato6; // Almacena el sexto dato extraído de la cadena.
void setup() {
// Inicia la comunicación serie a una velocidad de 9600 baudios.
Serial.begin(9600); // Esta es la velocidad con la que vamos a comunicarnos por el puerto serie.
}
void loop() {
// Verifica si hay datos disponibles en el puerto serie.
//+CGNSINF: 1,1,20230827083541.000,-2.192826,-80.988875,0.52
if(Serial.available() > 0) {
char datoAux = Serial.read(); // Lee un carácter del puerto serie y lo guarda en 'datoAux'.
cadena += datoAux; // Añade el carácter leído a la cadena 'cadena'.
// Verifica si el carácter leído es un salto de línea ('\n').
if(datoAux == '\n') {
// Extrae los valores de la cadena separada por comas y los guarda en las variables correspondientes.
dato1 = getValue(cadena, ',', 0); // Extrae el primer valor antes de la primera coma.
dato2 = getValue(cadena, ',', 1); // Extrae el segundo valor después de la primera coma.
dato3 = getValue(cadena, ',', 2); // Y así sucesivamente...
dato4 = getValue(cadena, ',', 3);
dato5 = getValue(cadena, ',', 4);
dato6 = getValue(cadena, ',', 5);
// Imprime los datos extraídos con un texto descriptivo.
Serial.print("+CGNSINF:"); // Identificador de la información recibida.
Serial.println(dato1); // Muestra el primer dato.
Serial.print("ESTADO:"); // Muestra un encabezado para el segundo dato.
Serial.println(dato2); // Muestra el segundo dato.
Serial.print("FECHA:"); // Muestra un encabezado para el tercer dato.
Serial.println(dato3); // Muestra el tercer dato.
Serial.print("LATITUD:"); // Muestra un encabezado para el cuarto dato.
Serial.println(dato4); // Muestra el cuarto dato.
Serial.print("LONGITUD:"); // Muestra un encabezado para el quinto dato.
Serial.println(dato5); // Muestra el quinto dato.
Serial.print("VELOCIDAD:"); // Muestra un encabezado para el sexto dato.
Serial.println(dato6); // Muestra el sexto dato.
// Limpia la cadena para que pueda recibir nueva información en la próxima iteración.
cadena = "";
}
}
}
// Función para dividir una cadena de texto en partes según un separador y devolver la parte deseada.
String getValue(String data, char separator, int index) {
int found = 0; // Contador para saber cuántos separadores hemos encontrado.
int strIndex[] = { 0, -1 }; // Array para almacenar los índices de inicio y final de la subcadena.
int maxIndex = data.length() -1; // Longitud máxima de la cadena.
// Bucle para recorrer la cadena y encontrar el índice de la subcadena deseada.
for (int i = 0; i <= maxIndex && found <= index; i++) {
if (data.charAt(i) == separator || i == maxIndex) { // Verifica si el carácter actual es el separador o si hemos llegado al final de la cadena.
found++; // Aumenta el contador de separadores encontrados.
strIndex[0] = strIndex[1] + 1; // Actualiza el índice de inicio de la subcadena.
strIndex[1] = (i == maxIndex) ? i + 1 : i; // Actualiza el índice final de la subcadena.
}
}
// Devuelve la subcadena deseada o una cadena vacía si no se encontró.
return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}