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.
Conversione stringhe Gps
Moderatore:
Paolino
41 messaggi
• Pagina 4 di 5 • 1, 2, 3, 4, 5
4
voti
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-

Paolino
32,6k 8 12 13 - G.Master EY

- Messaggi: 4226
- Iscritto il: 20 gen 2006, 11:42
- Località: Vigevano (PV)
0
voti
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.
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.
4
voti
La divisione per 1000 non è a caso.
Se consideriamo ad esempio 8166752 e lo dividiamo per 1000, si otiene:
![\[\frac{8166752}{1000}=8166.752 \] \[\frac{8166752}{1000}=8166.752 \]](/forum/latexrender/pictures/5b339510a994254c2f9f69188888e501.png)
se prendiamo la sola parte intera, si ha:

Il valore
è 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 \] \[\frac{8166752}{100}=81667.52 \]](/forum/latexrender/pictures/c0cbd507fdcfabfcf5f0aa07a133da2d.png)
se prendiamo la sola parte intera, si ha:

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.
Se consideriamo ad esempio 8166752 e lo dividiamo per 1000, si otiene:
![\[\frac{8166752}{1000}=8166.752 \] \[\frac{8166752}{1000}=8166.752 \]](/forum/latexrender/pictures/5b339510a994254c2f9f69188888e501.png)
se prendiamo la sola parte intera, si ha:

Il valore
è ampiamente gestibile con variabili di tipo int o unsigned intLa 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 \] \[\frac{8166752}{100}=81667.52 \]](/forum/latexrender/pictures/c0cbd507fdcfabfcf5f0aa07a133da2d.png)
se prendiamo la sola parte intera, si ha:

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
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-

Paolino
32,6k 8 12 13 - G.Master EY

- Messaggi: 4226
- Iscritto il: 20 gen 2006, 11:42
- Località: Vigevano (PV)
1
voti
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
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
2
voti
Bene, Marcello. SOno contento!
Aspetto di vedere il codice.
Ciao.
Paolo.
Aspetto di vedere il codice.
Ciao.
Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-

Paolino
32,6k 8 12 13 - G.Master EY

- Messaggi: 4226
- Iscritto il: 20 gen 2006, 11:42
- Località: Vigevano (PV)
0
voti
Iniziamo dalla prima modifica:
Nella funzione che tu mi avevi suggerito
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:
ho capito come utilizzare la funzione con variabili long int:
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:
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.
Così facendo nel mio ciclo while andro a scrivere;
Sicuramente ci sono delgi errori perché non ho molta esperienza con l'uso dei puntatori e delle funzioni!
Cosa ne dici?
Grazie.
Marcello.
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.
2
voti
Leggerò con calma questo post. Ora sono un po' preso.
Paolo.
Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-

Paolino
32,6k 8 12 13 - G.Master EY

- Messaggi: 4226
- Iscritto il: 20 gen 2006, 11:42
- Località: Vigevano (PV)
3
voti
Prova a realizzare la funzione conversione in questo modo:
e poi la richiami così:
Ciao.
Paolo.
- 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
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-

Paolino
32,6k 8 12 13 - G.Master EY

- Messaggi: 4226
- Iscritto il: 20 gen 2006, 11:42
- Località: Vigevano (PV)
0
voti
Ciao Paolo,
ho provato il tuo codice ma penso che ci siano dei problemi nella funzione
Sembra che non accetti come valore di ritorno un array:
se invece la uso così
tutto funziona.
Grazie
Marcello.
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.
0
voti
Ciao Paolo,
se riuscito a trovare il problema alla funzione che mi hai suggerito?
Grazie
Marcello.
se riuscito a trovare il problema alla funzione che mi hai suggerito?
- Codice: Seleziona tutto
latitude = conversione (coordinata_latitudine_in_stringa);
Grazie
Marcello.
41 messaggi
• Pagina 4 di 5 • 1, 2, 3, 4, 5
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 7 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)
