Go Down

Topic: Extraer informacion de una trama de informacion, almacenada en un estring (Read 99 times) previous topic - next topic

JESUSto2015

Buenas amigos.. Necesito ayuda urgente. Estoy manejando unos datos de GPS (GPRMC) del cual me lllega el siguiente string

$GPRMC,233947,A,1022.6805,N,06656.7771,W,000.8,356.7,170415,,,A*6C

he almacenado toda la trama en un string, ahora solo necesito el valor que se puede apreciar de 1022.6805 y 6656.7771. He intentado de multiples formas con substring y stringcharaters pero no di con lo que necesitaba.

aqui le dejo la programacion que tengo

Code: [Select]
#include <string.h>
 #include <ctype.h>
 String guardar = "";
 int pinp = 12;
 int ledPin = 13;                  // LED test pin
 int rxPin = 0;                    // RX PIN
 int txPin = 1;                    // TX TX
 int byteGPS=-1;
 char linea[300] = "";
 float lat;
 char comandoGPR[7] = "$GPRMC";
 int cont=0;
 int bien=0;
 int conta=0;
 int indices[13];
 
 void setup() {
   pinMode(ledPin, OUTPUT);       // Initialize LED pin
   pinMode(rxPin, INPUT);
   pinMode(txPin, OUTPUT);
   pinMode(pinp, OUTPUT);
   Serial.begin(4800);
   for (int i=0;i<300;i++){       // Initialize a buffer for received data
     linea[i]=' ';
   }  
 }
 void loop() {
   digitalWrite(ledPin, HIGH);
   byteGPS=Serial.read();         // Read a byte of the serial port
   if (byteGPS == -1) {           // See if the port is empty yet
     delay(100);
   } else {
     // note: there is a potential buffer overflow here!
     linea[conta]=byteGPS;        // If there is serial port data, it is put in the buffer
     conta++;                      
     Serial.write(byteGPS);
     if (byteGPS==13){            // If the received byte is = to 13, end of transmission
       // note: the actual end of transmission is <CR><LF> (i.e. 0x13 0x10)
       digitalWrite(ledPin, LOW);
       cont=0;
       bien=0;
       // The following for loop starts at 1, because this code is clowny and the first byte is the <LF> (0x10) from the previous transmission.
       for (int i=1;i<7;i++){     // Verifies if the received command starts with $GPR
         if (linea[i]==comandoGPR[i-1]){
           bien++;
         }
       }
       if(bien==6){               // If yes, continue and process the data
         for (int i=0;i<300;i++){
           if (linea[i]==','){    // check for the position of the  "," separator
             // note: again, there is a potential buffer overflow here!
            guardar += linea;
            
            
            digitalWrite(ledPin,HIGH);
            delay(500);
            digitalWrite(ledPin,LOW);
            delay(500);
            Serial.println("");
            Serial.println(guardar);
//      if (guardar.substring(15,22) = float(lat) ) { Serial.print(linea);}

            
             indices[cont]=i;
             cont++;
           }
           if (linea[i]=='*'){    // ... and the "*"
             indices[12]=i;
             cont++;
           }
         }
         Serial.println("");      // ... and write to the serial port
         Serial.println("");
         Serial.println("---------------");
         for (int i=0;i<12;i++){
           switch(i){
             case 0 :Serial.print("TIEMPO UTC): ");break;
             case 1 :Serial.print("Status (A=OK,V=KO): ");break;
             case 2 :Serial.print("LATITUD: ");break;
             case 3 :Serial.print("DIRECCION (N/S): ");break;
             case 4 :Serial.print("LONGITUD: ");break;
             case 5 :Serial.print("DIRECCION (E/O): ");break;
             case 6 :Serial.print("VeELOCIDAD: ");break;
             case 7 :Serial.print("GRADPS: ");break;
             case 8 :Serial.print("fecha UTC): ");break;
             case 9 :Serial.print("Grados mag: ");break;
             case 10 :Serial.print("(E/O): ");break;
             case 11 :Serial.print("Mode: ");break;
             case 12 :Serial.print("Checksum: ");break;
           }
           for (int j=indices[i];j<(indices[i+1]-1);j++){
             Serial.print(linea[j+1]);
           }
           Serial.println("");
         }
         Serial.println("---------------");

       }
       conta=0;                    // Reset the buffer
       for (int i=0;i<300;i++){    //  
         linea[i]=' ';            
       }                
     }
   }
 }


consiste Generalmente en un contador que me compara los datos obtenidos y al ver $GPSRMC empieza leer en cada coma atraves de un contador.

Estoy utilizando arduino uno y el gps es PARALLAX RECIVER.. el mas basico.

muchas gracias.



_jose_

Si lo almacenas en un array de caracteres (char) , puedes usar la funcion strtok para partir el array en diferentes trozos separados por el parametro que le pases,en este caso la coma.Aqui lo explican bien:
http://jhaskellsblog.blogspot.com.es/2011/06/parsing-quick-guide-to-strtok-there-are.html
Si quieres pasar esos valores a numericos,puedes usar diferentes funciones :atoi() para int ,atof() para float.

max_saeta

Saludos


Code: [Select]
String cadena1 = "";
String cadena2 = "";

void desglosa(String &cad){
int temp1 = 0;
int temp2 = 0;
if(cad.indexOf("$GPRMC")>-1){
temp1 = cad.indexOf(',');
temp2 = cad.indexOf(',',temp1+1);
temp1 = cad.indexOf(',',temp2+1);
temp2 = cad.indexOf(',',temp1+1);
cadena1 = cad.substring(temp1+1,temp2);
temp1 = cad.indexOf(',',temp2+1);
temp2 = cad.indexOf(',',temp1+1);
cadena2 = cad.substring(temp1+1,temp2);
Serial.println(cadena1);
Serial.println(cadena2);
}
}



Esta función te permite sustraer de la cadena:

Code: [Select]
$GPRMC,233947,A,1022.6805,N,06656.7771,W,000.8,356.7,170415,,,A*6C

Los valores que están entre las comas que contienen los numeros 1022.6805 y 06656.7771

Colocala en tu codigo y para llamarla debes pasarle la cadena que deseas buscar.

desglosa(micadena);
Donde micadena es una variable String. La funcion cargara las dos cadenas resultantes en las variables cadena1 y cadena2


Go Up