Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Conversione stringhe Gps

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[11] Re: Conversione stringe Gps

Messaggioda Foto Utentericello9 » 31 lug 2012, 14:20

Ok allora il codice completo e corretto è il seguente:
Codice: Seleziona tutto
char index;
char * stringa_dei_gradi;
char * stringa_dei_decimali;
char index = 0;
char pos = 0;

while (coordinata[index]!='.')
{
    stringa_dei_gradi[index] = coordinata[index];
    index ++;
}
stringa_dei_gradi[index] ='\0';
index++;

while(coordinata[index]!=',');
    {
   stringa_dei_decimali[pos]= coordinata[index];
    index++;
   pos++;   
   }
stringa_dei_decimali[pos] ='\0';


A questo punto mi ritrovo con due array distinti che contengono la parte intera e quella decimale dalla mia variabile.
Adesso devo procedere così:
risultato1=(stringa_dei_gradi[0]*10) + stringa_dei_gradi[1]
risultato2=(stringa_dei_gradi[2]*10) + stringa_dei_gradi[3]
risultato3=stringa_dei_decimali[0]+(stringa_dei_decimali[1]*10)+(stringa_dei_decimali[2]*100)+(stringa_dei_decimali[3]*1000)
risultato4=(risultato3/10000)+risultato2
risultato5=(risultato4+risultato2)/3600
risultato_finale=risultato5+risultato1

non so se è l'approccio corretto o se ce qulche altro modo!
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

2
voti

[12] Re: Conversione stringe Gps

Messaggioda Foto UtentePaolino » 31 lug 2012, 14:43

Non so se la formula in sè sia corretta, ma c'è un formalismo che non torna.
Se tu visualizzi stringa_dei_gradi[0], supponendo che valga '4', quello che ottieni è il codice ASCII di '4', ossia 52. È necessario "normalizzare" il valore, passando dal 'carattere' al numero. Dovrai pertanto fare qualcosa del tipo:

Codice: Seleziona tutto
risultato1=((stringa_dei_gradi[0]-48)*10) + (stringa_dei_gradi[1]-48)


Così, se stringa_dei_gradi[0] valesse '4' e stringa_dei_gradi[1] valesse '2', il compilatore esegue:

Codice: Seleziona tutto
risultato1=((52-48)*10) + (50-48)

che corrisponde a

Codice: Seleziona tutto
risultato1=42


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)

2
voti

[13] Re: Conversione stringe Gps

Messaggioda Foto UtentePaolino » 31 lug 2012, 14:44

Il valore 48 è il codice ASCII del numero 0.

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

[14] Re: Conversione stringe Gps

Messaggioda Foto Utentericello9 » 31 lug 2012, 21:32

Si hai ragione, per visualizzare correttamente il valore devo primo traformarlo da carattere a numero.
Oppure, come sto facendo in questo momento, utilizzo il software RS232 terminal che mi offre l'opzione di convertire i dati in ingresso in formato ascii automaticamente.
Il problema più grosso è che mi ritrovo la mia variabile "risultato_finale", che contiene la coordinata convertita, in formato float e non so come fare per stamparla a video.
Fino adesso stampavo a video la viabile non convertita direttamente dall'array coordinata, utilizzando la funzione WriteUsart1(); che mi stampa un carattere allla volta.
Candy mi suggeriva di utilizzare la funzione fprintf(), ma non so come fare.
Ciao.
Marcello.
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

2
voti

[15] Re: Conversione stringe Gps

Messaggioda Foto UtentePaolino » 31 lug 2012, 21:38

Forse è meglio usare la sprintf() e non la fprintf. Credo che per Foto UtenteCandy si tratti solo di un refuso ;-)
Comunque, con la sprintf() converti un valore numerico in stringa. Consiglio: non usare i float ma usa gli int a 16 bit oppure i long int a 32 bit.

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

[16] Re: Conversione stringe Gps

Messaggioda Foto Utentericello9 » 31 lug 2012, 22:43

Consiglio: non usare i float ma usa gli int a 16 bit oppure i long int a 32 bit.


Ho provato a usare le variabili int, ma quando eseguo la divisione il risultato non è giusto.
risultato=9/4;
resto=9%4;

Il valore della varibile resto come operazione fra interi mi da uno invece se uso le varibili float mi risulta 2,25.
Dove sbaglio?
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

2
voti

[17] Re: Conversione stringe Gps

Messaggioda Foto UtentePaolino » 1 ago 2012, 11:49

Domanda: ma le divisioni sono solo in "risultato4" e "risultato5" o mene sono perse altre?
Per l'uso degli int, lo si può fare: è un po' poiù complessa l'analisi del formato, ma almeno ti togli un po' di casini.
Sono all'estero, con calma ti mando una nota più avanti.

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

[18] Re: Conversione stringe Gps

Messaggioda Foto Utentericello9 » 1 ago 2012, 12:13

Domanda: ma le divisioni sono solo in "risultato4" e "risultato5" o mene sono perse altre?

Si le divisioni le uso solo in quel caso.

Ok, tranquillo tanto no ho fretta.

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

2
voti

[19] Re: Conversione stringe Gps

Messaggioda Foto UtentePaolino » 8 ago 2012, 9:18

Per poter eseguire i calcoli con i soli interi, è necessario aumentarne un po' la risoluzione, al fine di evitare la perdita della precisione. Prima di tutto, dovrai determinare il range di variabilità dei dati che hai in mano, l'ìntervallo significativo ed anche il numero di cifre decimali che possono/devono essere utilizzate.
A questo punto, decidi un fattore di moltiplicazione in termini di potenza di dieci che possa permetterti di far rientrare le variablili nel range che ti sei concesso.

Esempio:se hai:
a = 0.456789

b = 2400

c = 325

e devi calcolare

\[d=\frac{a}{c}b\]

con i float otterresti:

d= 3.373211

Se invece si lavorasse con gli interi a 32 bit, si potrebbe pensare di fare così:

LongA = a * 1000000;

d = (LongA*b)/c

svolgendo i calcoli, si ha:

d = 3373211

Ora, questo termine comprende la parte intera più tutti i decimali. VOlendo rappresentarli tutti su un display, è necessario separarli:

ParteIntera = d/1000000;
PArteDecimale = d - ParteIntera;

Da qui, con l'uso di sprintf() e le funzioni per rappresentare le stringhe su LCD, dovresti riuscire a visualizzare quanto ti serve.

Fammi sapere se fino a qui è tutto chiaro.

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

[20] Re: Conversione stringe Gps

Messaggioda Foto Utentericello9 » 8 ago 2012, 22:46

Ciao Paolo, ho rivisto il codice seguendo i tuoi consigli e con il simulatore sembra tutto ok:
Codice: Seleziona tutto
void conversione(void){
                  
unsigned int coordinata[]={1,4,5,4,9,0,2,9,1,7};

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

//4549.2917,N
//45 + (49.2917/60)= 45,821528333


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

Per due risultati ho usato delle variabili float ma penso che questo non crei nessun problema.
Ti sembra tutto ok?
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 1 ospite