Go Down

Topic: Extraer informacion de una trama de informacion, almacenada en un estring (Read 162 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy