Ni lo probe al codigo... Pero aca va:
//Datos Finales
struct DatosGPS {
float NumLatitud;
float NumLongitud;
char DireccionLatitud;
char DireccionLongitud;
};
struct DatosGPS DatosGPS;
char * strGPS = "0610.9689,N,07535.1974,W";
void main(void)
{
while(1)
{
ParserGPSData(strGPS,&DatosGPS);
}
}
void ParserGPSData(char * ptr, struct DatosGPS * Datos)
{
uint8_t i = 0;
struct Parserptrs Tmp;
char * ptrArray[4];
char NumLat[3];
char NumLong[4];
// Primer inicio de string
ptrArray[i] = ptr;
// Separo los string, cambio la coma por un caracter nulo y guardo los punteros de cada inicio de string
while(*ptr) {
if(*ptr == ',') {
*ptr++='\0';
ptrArray[++i] = ptr;
}
}
//Separo los primeros 2 digitos de Lat y Long y cierro el string. Adelanto los punteros para quitar esos caracteres.
memcpy(NumLong
,ptrArray
[2],3); ptrArray[0] += 2;
ptrArray[2] += 3;
NumLat[3] = '\0';
NumLong[4] = '\0';
//Es hora de la conversion y guardado de datos.
Datos
->NumLatitud
= atoi(NumLat
) + (atof(ptrArray
[0]) / 60); Datos
->NumLongitud
= atoi(NumLong
) + (atof(ptrArray
[2]) / 60); if(*ptrArray[1] == 'S') Datos->NumLatitud *= -1;
if(*ptrArray[3] == 'W') Datos->NumLongitud *= -1;
}
El proceso (o la idea) es el siguiente, suponiendo que puedo modificar el string que pasa inicialmente.
Primer parte, transformar esto:
0610.9689,N,07535.1974,W\0
En esto:
0610.9689\0N\007535.1974\0W\0
Y guardar el comienzo de cada string, es decir que si ahora considero las string que apuntan ptrArray serian:
*ptrArray[0] = "0610.9689"
*ptrArray[1] = "N"
*ptrArray[2] = "07535.1974"
*ptrArray[3] = "W"
De aca ahora solo me queda separar los numeros. Con el memcpy, solo muevo 2 o 3 elementos segun sea Lat o Long a otro string, tambien modifico los punteros para quitar esa parte del string, es decir quedaria:
*NumLat = "06"
*NumLong = "075"
*ptrArray[0] = "10.9689"
*ptrArray[1] = "N"
*ptrArray[2] = "35.1974"
*ptrArray[3] = "W"
Ahora ya tengo los string de cada uno, solo me falta pasarlos a enteros o float segun sea el caso. Y aplicar las formulas que pasaste. Que es la ultima parte del programa.
---------------------------
Ojo, respete y acepto solamente el formato que me pasaste, es decir:
dd + mm.mmmm para latitud
ddd + mm.mmmm para longitud