Conversión DMS de latitud y longitud en MPLAB XC8

0

Estoy usando dos funciones para la conversión DMS a largo y largo. cuando estoy usando esas dos funciones, se visualiza correctamente lat o lon en mi UART. cuando primero imprima la latitud en UART, muestre el valor DMS correcto. luego, cuando imprima la segunda, su dosnt muestra el valor correcto (0000000) .

void lat_DMS(char *lat_data, char *lat_return)
{
                char temp[3],temp1[3];
                float res1=atof(lat_data);
                float flo=res1/100;
                int ilong=flo;
                latdeg[0]=ilong;
                sprintf(temp,"%03d",ilong);
                strncat(lat_return,temp,strlen(temp));
                float lati=flo-ilong;//subtract the values
                float res12=lati*60;//multiply the value differ value with 60
                int minutes=res12;
                latdeg[1]=minutes;
                sprintf(temp,"%02d",minutes);
                strncat(lat_return,temp,strlen(temp));  
                float isec=res12-minutes;
                int lasec=isec*60;
                latdeg[2]=lasec;
                sprintf(temp,"%02d",lasec);
                strncat(lat_return,temp,strlen(temp));

}

void lon_DMS(char *lon_data, char *lon_return)
{
                char temp1[3];
                float res2=atof(lon_data);
                float lonflo=res2/100;
                int inlong=lonflo;
                londeg[0]=inlong;
                sprintf(temp1,"%03d",inlong);
                strncat(lon_return,temp1,strlen(temp1));
                float longi=lonflo-inlong;//subtract the values
                float lonres=longi*60;//multiply the value differe value with 60
                int lonminutes=lonres;
                londeg[1]=lonminutes;
                sprintf(temp1,"%02d",lonminutes);
                strncat(lon_return,temp1,strlen(temp1));  
                float lonsec=lonres-lonminutes;
                int longisec=lonsec*60;
                londeg[2]=longisec;
                sprintf(temp1,"%02d",longisec);
                strncat(lon_return,temp1,strlen(temp1));


}

Estoy almacenando valor en matrices para transmitir 4 bytes + 4 bytes de latitud y longitud (Deg, Min, sec, dire cada 1 byte)

en la función principal

     uartwrite("LAT:");          
    lat_DMS(latPtr,&Dlat);
    uartwrite(&Dlat);
    uartwrite("\r\n");
    memset(Dlat,'
void lat_DMS(char *lat_data, char *lat_return)
{
                char temp[3],temp1[3];
                float res1=atof(lat_data);
                float flo=res1/100;
                int ilong=flo;
                latdeg[0]=ilong;
                sprintf(temp,"%03d",ilong);
                strncat(lat_return,temp,strlen(temp));
                float lati=flo-ilong;//subtract the values
                float res12=lati*60;//multiply the value differ value with 60
                int minutes=res12;
                latdeg[1]=minutes;
                sprintf(temp,"%02d",minutes);
                strncat(lat_return,temp,strlen(temp));  
                float isec=res12-minutes;
                int lasec=isec*60;
                latdeg[2]=lasec;
                sprintf(temp,"%02d",lasec);
                strncat(lat_return,temp,strlen(temp));

}

void lon_DMS(char *lon_data, char *lon_return)
{
                char temp1[3];
                float res2=atof(lon_data);
                float lonflo=res2/100;
                int inlong=lonflo;
                londeg[0]=inlong;
                sprintf(temp1,"%03d",inlong);
                strncat(lon_return,temp1,strlen(temp1));
                float longi=lonflo-inlong;//subtract the values
                float lonres=longi*60;//multiply the value differe value with 60
                int lonminutes=lonres;
                londeg[1]=lonminutes;
                sprintf(temp1,"%02d",lonminutes);
                strncat(lon_return,temp1,strlen(temp1));  
                float lonsec=lonres-lonminutes;
                int longisec=lonsec*60;
                londeg[2]=longisec;
                sprintf(temp1,"%02d",longisec);
                strncat(lon_return,temp1,strlen(temp1));


}
',strlen(Dlat)); uartwrite("LON:"); lon_DMS(lonPtr,&Dlon); uartwrite(&Dlon); uartwrite("\r\n"); memset(Dlon,'
     uartwrite("LAT:");          
    lat_DMS(latPtr,&Dlat);
    uartwrite(&Dlat);
    uartwrite("\r\n");
    memset(Dlat,'%pre%',strlen(Dlat));

 uartwrite("LON:");          
    lon_DMS(lonPtr,&Dlon);
    uartwrite(&Dlon);
    uartwrite("\r\n");
    memset(Dlon,'%pre%',strlen(Dlon));
',strlen(Dlon));

si la pila está llena? Estoy confundido. Estoy cargando mi programa en mi controlador, no se está cargando correctamente y cuando lo cargo por segunda vez en micro cont, el programa previamente cargado se está ejecutando. He escrito uartwrite mientras que el bucle más de 2 veces no muestra el tiempo y el valor de lon

    
pregunta user1811790

1 respuesta

1

No se ha dicho explícitamente en ninguna parte de la pregunta cuáles son los formatos de entrada y salida, así que estoy adivinando un poco.

Y no estoy seguro de por qué parece que lo has complicado demasiado. Ciertamente tienes muchas más variables y copias de cadenas de las que necesitas. Asumiendo que tiene valores de formato NMEA entrando, entonces todo lo que necesita es:

// lon_data = NMEA format string DDDMM.mmmmm
// lon_return = DDMMSS.sss
void lon_DMS(const char *lon_data, char *lon_return)
{
  float workingValue = atof(lon_data);
  int degrees = workingValue/100;
  workingValue = workingValue - degrees *100; // minutes only
  int minutes = (int) workingValue;
  workingValue = 60*(workingValue - minutes); // seconds
  sprintf(lon_return ,"%03d%02d%06.3f", degrees, minutes, workingValue);
}
    
respondido por el Andrew

Lea otras preguntas en las etiquetas