Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Conversione stringhe Gps

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

4
voti

[31] Re: Conversione stringhe Gps

Messaggioda Foto UtentePaolino » 11 ago 2012, 14:38

Eccoti accontentato:

unsigned int coordinata[]={1,4,5,4,9,0,2,9,1,7};
char coordinatafinale[20];

unsigned int risultato=0;
unsigned long risultato1=0;
unsigned long risultato2=0;
unsigned long risultato3=0;
unsigned long risultato5=0;
unsigned long int parteintera=0;
unsigned long int partedecimale=0;

risultato=(coordinata[1]*10)+coordinata[2];// -> 45
risultato1=((coordinata[3]*10)+coordinata[4])*10000000;// -> 490000000
risultato2=(coordinata[6]*1000)+(coordinata[7]*100)+(coordinata[8]*10)+(coordinata[9]);// ->2917
risultato3= risultato1+risultato2;// -> 492917000
risultato5= risultato3/60;// -> 8215283
parteintera=(risultato5/10000000)+risultato;// -> 45
partedecimale=risultato5-parteintera;// ->8215283

sprintf(coordinatafinale,"%02d.%04d",(int)parteintera, (unsigned int)(partedecimale/1000));


Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[32] Re: Conversione stringhe Gps

Messaggioda Foto Utentericello9 » 12 ago 2012, 0:17

Ho provato il codice e sembra funzionare, domani provo ad inserirlo nel programma
Principale e vediamo.
Da quello che ho capito l'array "coordinatafinale" é costituito dalla conversione in formato decimale della variabile "parteintera" e dalla variabile "partedecimale".
Per la prima prendo solo le due cifre piú significative mentre per la seconda conversione le prime 4 cifre.
in caso volessi aumentare le precisione della variabile "partedecimale" basterebbe aumentare il numero %04 nella funzione sprintf() e dividere la variabile per 100 al posto di 1000; cosí facendo otterrei una cifra in piú dopo la virgola nell'array "coordinatafinale .
Giusto?

Grazie.
Marcello.
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

4
voti

[33] Re: Conversione stringhe Gps

Messaggioda Foto UtentePaolino » 12 ago 2012, 8:35

La divisione per 1000 non è a caso.

Se consideriamo ad esempio 8166752 e lo dividiamo per 1000, si otiene:
\[\frac{8166752}{1000}=8166.752 \]

se prendiamo la sola parte intera, si ha:
int(8166.752)=8166

Il valore 8166 è ampiamente gestibile con variabili di tipo int o unsigned int

La divisione per 100 invece non è proprio rosa e fiori.
Infatti, se consideriamo ancora 8166752 e lo dividiamo per 100, si otiene:
\[\frac{8166752}{100}=81667.52 \]

se prendiamo la sola parte intera, si ha:
int(81667.52)=81667

Questo valore supera il limite di 65535 degli unsigned int.

Il discorso %04 invece indica il numero di cifre significative che vengono prese dalla sprintf(). Lo zero indica che per esempio 123 viene scritto come 0123, cioè con quattro cifre. Nel tuo caso forse è sufficiente scrivere %4.

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

1
voti

[34] Re: Conversione stringhe Gps

Messaggioda Foto Utentericello9 » 13 ago 2012, 23:03

Ciao Paolo, ho inserito il codice che abbiamo creato all'inteno nel mio programma e tutto sembra funzionare.
Nel fine settimana ritorno a casa e ti posto il codice per vedere se hai dei suggerimenti per ottimizzare il codice.
Grazie per L'aiuto.

Ciao.
Marcello
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

2
voti

[35] Re: Conversione stringhe Gps

Messaggioda Foto UtentePaolino » 14 ago 2012, 7:51

Bene, Marcello. SOno contento! :ok:
Aspetto di vedere il codice.

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[36] Re: Conversione stringhe Gps

Messaggioda Foto Utentericello9 » 17 ago 2012, 23:38

Iniziamo dalla prima modifica:
Nella funzione che tu mi avevi suggerito
Codice: Seleziona tutto
sprintf(coordinatafinale,"%02d.%04d",(int)parteintera, (unsigned int)(partedecimale/1000));

avevo quel problemino delle sole 4 cifre decimali che dopo vari tentativi sono riuscito a risolvere.
Il problema era che l'ultimo argomento della funzione accettava in ingresso variabili intere mentre il mio dato "partedecimale" era in long int e quindi metà variabile dovevo troncarla.
A questo punto ho continuato a cercare in internet esempi di codice dove veniva usata la funzione sprintf(); e grazie anche ad un tuo suggerimento:
Ora, la cosa curiosa è che il %l (l= elle) è ben documentato e indica variabili long int o unsigned long int, però sembra non funzionare.

ho capito come utilizzare la funzione con variabili long int:
Codice: Seleziona tutto
sprintf(latitudinefinale,"%02d.%7ld",(int)parteintera1,(unsigned long int)partedecimale1);

Così facendo ottengo la mia coordinata con ben 7 cifre decimali.

La seconda modifica al quale sto lavorando, ma finora senza risultato, consiste nel migliorare la mia funzione conversione.
Cerco di spiegarmi meglio:
Codice: Seleziona tutto
void conversione (void){

char h;
unsigned int risultato=0;
unsigned long risultato1=0;
unsigned long risultato2=0;
unsigned long risultato3=0;
unsigned long risultato4=0;
unsigned long risultato5=0;
unsigned long parteintera=0;
unsigned long partedecimale=0;

unsigned int risultato10=0;
unsigned long risultato11=0;
unsigned long risultato12=0;
unsigned long risultato13=0;
unsigned long risultato14=0;
unsigned long risultato15=0;
unsigned long parteintera1=0;
unsigned long partedecimale1=0;

risultato=((coordinata2[2]-48)*10)+(coordinata2[3]-48);// -> 45
risultato1=(((coordinata2[4]-48)*10)+(coordinata2[5]-48))*10000000;// -> 490000000
risultato2=((coordinata2[7]-48)*1000)+((coordinata2[8]-48)*100)+((coordinata2[9]-48)*10)+(coordinata2[10]-48);// ->2917000
risultato3= risultato1+(risultato2*1000);// -> 492917000
risultato5= risultato3/60;// -> 8215283
parteintera=(risultato5/10000000)+risultato;// -> 45
partedecimale=risultato5-parteintera;// ->8215283

sprintf(longitudinefinale,"%02d.%7ld",(int)parteintera,(unsigned long int)(partedecimale));

risultato10=((coordinata1[1]-48)*10)+(coordinata1[2]-48);// -> 45
risultato11=(((coordinata1[3]-48)*10)+(coordinata1[4]-48))*10000000;// -> 490000000
risultato12=((coordinata1[6]-48)*1000)+((coordinata1[7]-48)*100)+((coordinata1[8]-48)*10)+(coordinata1[9]-48);// ->2917000
risultato13= risultato11+(risultato12*1000);// -> 492917000
risultato15= risultato13/60;// -> 8215283
parteintera1=(risultato15/10000000)+risultato10;// -> 45
partedecimale1=risultato15-parteintera1;// ->8215283

sprintf(latitudinefinale,"%02d.%7ld",(int)parteintera1,(unsigned long int)partedecimale1);

putrs1USART("Conversione lon :    ");
while (Busy1USART());
for(h=0; longitudinefinale[h]!='\0' ;h++){
Write1USART(longitudinefinale[h]);
while (Busy1USART());
}
putrs1USART("\r\n");

putrs1USART("Conversione lat:    ");
while (Busy1USART());
for(h=0;latitudinefinale[h]!='\0 ';h++){
Write1USART(latitudinefinale[h]);
while (Busy1USART());
}
putrs1USART("\r\n");
}


Come vedi ho dovuto creare una copia della porzione di codice che abbiamo creato visto che le coordinate da convertire sono due, latitudine e longitudine, aumentando le risorse di memoria utilizzate.
La mia idea era di creare la funzione conversione() dove gli passavo come argomento una o l'altra coordinata.

Codice: Seleziona tutto
unsigned char  conversione1 (unsigned int *coord){

unsigned int risultato=0;
unsigned long risultato1=0;
unsigned long risultato2=0;
unsigned long risultato3=0;
unsigned long risultato4=0;
unsigned long risultato5=0;
unsigned long parteintera=0;
unsigned long partedecimale=0;

risultato=((coord[2]-48)*10)+(coord[3]-48);// -> 45
risultato1=(((coord[4]-48)*10)+(coord[5]-48))*10000000;// -> 490000000
risultato2=((coord[7]-48)*1000)+((coord[8]-48)*100)+((coord[9]-48)*10)+(coord[10]-48);// ->2917000
risultato3= risultato1+(risultato2*1000);// -> 492917000
risultato5= risultato3/60;// -> 8215283
parteintera=(risultato5/10000000)+risultato;// -> 45
partedecimale=risultato5-parteintera;// ->8215283

sprintf(coordinatafinale,"%02d.%7ld",(int)parteintera,(unsigned long int)(partedecimale));
return(*coordinatafinale);
}



Così facendo nel mio ciclo while andro a scrivere;
Codice: Seleziona tutto
conversione1(coordinata1);
memorizza_pos();
conversione1(coordinata2); 
memorizza_pos();


Sicuramente ci sono delgi errori perché non ho molta esperienza con l'uso dei puntatori e delle funzioni!
Cosa ne dici?

Grazie.
Marcello.
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

2
voti

[37] Re: Conversione stringhe Gps

Messaggioda Foto UtentePaolino » 18 ago 2012, 8:25

Leggerò con calma questo post. Ora sono un po' preso.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

3
voti

[38] Re: Conversione stringhe Gps

Messaggioda Foto UtentePaolino » 18 ago 2012, 17:09

Prova a realizzare la funzione conversione in questo modo:

Codice: Seleziona tutto
char *conversione (char *coord)
{

   char StringaConvertita[20];
   char h;
   unsigned int risultato=0;
   unsigned long risultato1=0;
   unsigned long risultato2=0;
   unsigned long risultato3=0;
   unsigned long risultato4=0;
   unsigned long risultato5=0;
   unsigned long parteintera=0;
   unsigned long partedecimale=0;

   risultato=((coord[2]-48)*10)+(coord2[3]-48);// -> 45
   risultato1=(((coord2[4]-48)*10)+(coord2[5]-48))*10000000;// -> 490000000
   risultato2=((coord2[7]-48)*1000)+((coord2[8]-48)*100)+((coord2[9]-48)*10)+(coord2[10]-48);// ->2917000
   risultato3= risultato1+(risultato2*1000);// -> 492917000
   risultato5= risultato3/60;// -> 8215283
   parteintera=(risultato5/10000000)+risultato;// -> 45
   partedecimale=risultato5-parteintera;// ->8215283

   sprintf(StringaConvertita,"%02d.%7ld",(int)parteintera,(unsigned long int)(partedecimale));

   return (StringaConvertita)

}


e poi la richiami così:


Codice: Seleziona tutto
   char latitude[20];
   char longitude[20];
   
   ....
   
   latitude = conversione (coordinata_latitudine_in_stringa);
   longitude = conversione (coordinata_longitudine_in_stringa);


Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[39] Re: Conversione stringhe Gps

Messaggioda Foto Utentericello9 » 19 ago 2012, 17:54

Ciao Paolo,
ho provato il tuo codice ma penso che ci siano dei problemi nella funzione
Codice: Seleziona tutto
latitude = conversione (coordinata_latitudine_in_stringa);


Sembra che non accetti come valore di ritorno un array:
Codice: Seleziona tutto
Z:\Programmi PIC\C18\GpsTracker\Main.c:618:Error [1153] cannot assign array type objects
Z:\Programmi PIC\C18\GpsTracker\Main.c:618:Error [1102] cannot assign to 'const' modified object
Z:\Programmi PIC\C18\GpsTracker\Main.c:618:Error [1131] type mismatch in assignment


se invece la uso così
Codice: Seleziona tutto
conversione2(coordinata2);
for (t=0;t<=19;t++)
   latitude[t]=StringaConvertita[t];

tutto funziona.

Grazie
Marcello.
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

0
voti

[40] Re: Conversione stringhe Gps

Messaggioda Foto Utentericello9 » 22 ago 2012, 13:35

Ciao Paolo,
se riuscito a trovare il problema alla funzione che mi hai suggerito?
Codice: Seleziona tutto
latitude = conversione (coordinata_latitudine_in_stringa);


Grazie
Marcello.
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 8 ospiti