¿Analizar datos GPS? [cerrado]

-1

Escribí un código para simular la recepción de una cadena NMEA desde mi GPS, pero tuve un problema al analizar la latitud, la longitud y la fecha. Quiero saber cuál es el problema con el código. Aquí está mi código:

    void GPS_parseSTR(char *lat,char *lon,char *day,char *month,char *year,char *string){
int i;
for (i=0;i<9;i++)
{
lat[i]=string[i+14];
lat[i+1]='
    void GPS_parseSTR(char *lat,char *lon,char *day,char *month,char *year,char *string){
int i;
for (i=0;i<9;i++)
{
lat[i]=string[i+14];
lat[i+1]='%pre%';
}

int j;
for (j=0;j<10;j++){
lon[j]=string[j+26];
lon[j+1]='%pre%';}

int k;
for (k=0;k<2;k++){
day[k]=string[k+49];
day[k+1]='%pre%';}

int l;
for (l=0;l<2;l++){
month[l]=string[l+51];
month[l+1]='%pre%';}

int m;
for (m=0;m<2;m++){
year[m]=string[m+53];
year[m+1]='%pre%';
              } 
           }

int main(){

 char lat[9];
 char lon[10];
 char day[2];
 char month[2];
 char year[2];
 char string[55]=",075747.000,A,2232.8990,N,11405.3368,E,3.9,357.8,260210" ;
 GPS_parseSTR(lat,lon,day,month,year,string);

printf("%s\n",lat);
printf("%s\n",lon);
printf("%s\n",day);
printf("%s\n",month);
printf("%s\n",year);
return 0 ;
}
'; } int j; for (j=0;j<10;j++){ lon[j]=string[j+26]; lon[j+1]='%pre%';} int k; for (k=0;k<2;k++){ day[k]=string[k+49]; day[k+1]='%pre%';} int l; for (l=0;l<2;l++){ month[l]=string[l+51]; month[l+1]='%pre%';} int m; for (m=0;m<2;m++){ year[m]=string[m+53]; year[m+1]='%pre%'; } } int main(){ char lat[9]; char lon[10]; char day[2]; char month[2]; char year[2]; char string[55]=",075747.000,A,2232.8990,N,11405.3368,E,3.9,357.8,260210" ; GPS_parseSTR(lat,lon,day,month,year,string); printf("%s\n",lat); printf("%s\n",lon); printf("%s\n",day); printf("%s\n",month); printf("%s\n",year); return 0 ; }
    

1 respuesta

4

Aunque los comentarios de MarkU y user572 han resuelto su problema inmediato al señalar que se requiere un byte adicional para mantener el terminador nulo, tiene otro problema subyacente que significa que este código no funcionará de manera confiable con datos de GPS reales. Para tomar la sección de ejemplo de una oración RMC:

,075747.000,A,2232.8990,N,11405.3368,E,3.9,357.8,260210

El valor 3.9 es la velocidad en nudos, ya que la velocidad aumenta, la oración puede llegar a ser:

,075747.000,A,2232.8990,N,11405.3368,E,10.1,357.8,260210

Ahora su fecha se ha movido en un carácter y sucederán cosas similares cuando el rumbo sea inferior a 100. Cuando en diferentes ubicaciones puede ocurrir lo mismo con la latitud y la longitud a medida que cambia el número de dígitos y también los diferentes receptores usan diferentes reglas para cuando se arrastran y los ceros iniciales se caen. Por lo tanto, este código no sería portátil y, en general, tratar de tratar las frases GPS como cadenas de longitud fija es una mala idea.

Una mejor idea es tratar cada campo como longitud variable analizando cada campo a medida que avanza y pasar al campo siguiente cuando encuentre una coma. En los sistemas integrados normalmente escribo ese código como una máquina de estado para que los datos puedan procesarse carácter por carácter a medida que llegan, pero una forma más sencilla de procesar toda la cadena de una vez sería utilizar strtok () que utiliza el carácter de coma como delimitador.

    
respondido por el PeterJ

Lea otras preguntas en las etiquetas