Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Conversione stringhe Gps

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Conversione stringhe Gps

Messaggioda Foto Utentericello9 » 26 lug 2012, 10:06

Ciao, dopo tante ore passate davanti al PC sono riuscito a estrapolare latitudine e longitudine da un modulo gps e salvarli nella erpom del mio pic18.
L'unico problema è che devo eseguire una conversione per poter leggere la posizione direttamente in google maps.
il formato originale è: 4546.5584,N che salvo in un array "GPSLat[11]"
la conversione dovrebbe eseguire questi calcoli:
45+(46/60)+(55,84/3600).
Grazie per l'aiuto.
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

3
voti

[2] Re: Conversione stringe Gps

Messaggioda Foto UtentePaolino » 29 lug 2012, 16:57

Si deve realizzare un parser della stringa in ingresso.
Una traccia per un possibile algoritmo potrebbe essere la seguente: leggi la stringa fino a che non trovi il simbolo ".". Tutti i caratteri letti (punto escluso) li metti in una nuova stringa che poi elaborerai, la chiamiamo "stringa dei gradi". A partire dal punto scandisci nuovamente la stringa dei dati in ingresso e cerchi l'altro carattere delimitatore che lo spazio " ". I caratteri in ingresso, spazio escluso, li metti nella "stringa dei decimali".

A questo punto hai tre stringhe. Dalla seconda e dalla terza vanno estratti i caratteri per realizzare un numero. Questo potrebbe essere un secondo passo (non è difficile).

Iniziamo con la realizzazione del parser e poi procediamo.

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

[3] Re: Conversione stringe Gps

Messaggioda Foto Utentericello9 » 29 lug 2012, 22:29

Ciao Paolo, in questi giorni ho provato a lavorare un po' di testa mia e ho elaborato questo.
Premetto che ho apportato una correzione alla conversione dei dati di latitudine e longitudine perche quelli vecchi erano sbagliati:

Codice: Seleziona tutto
void conversione(void){
                //0 1  2 3 4  5 6 7 8 9
unsigned int coordinata[]={1,4,5,4,9,0,2,9,1,7}; //esempio di valore in ingresso

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

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

risultato=(coordinata[1]*10)+coordinata[2];
risultato1=(coordinata[3]*10)+coordinata[4];
risultato2=(float)((coordinata[6]*1000)+(coordinata[7]*100)+(coordinata[8]*10) +(coordinata[9]))/10000;
risultato3= risultato1+risultato2;
risultato4=(float) risultato3/60;
risultato5=risultato+risultato4;
}

Così nella variabile float risultato5 ottengo il valore convertito.
Puo essere corretta come soluzione?
In caso affermativo come faccio a stampare a video una numero float?
Grazie per l'aiuto.
Marcello.
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

1
voti

[4] Re: Conversione stringe Gps

Messaggioda Foto UtenteCandy » 30 lug 2012, 0:21

Come ti era già stato suggerito, vedevo meglio prima di fare le conversioni, analizzare la stringa con un piccolo parser, altrimenti, la volta che ricevi un valore inferiore a 10, tutto il sistema posizionale della stringa va a farsi friggere.

Per convertire un valore da reale a stringa puoi usare la comodissima funzione fprintf(); che è parte della libreria standard.
Avatar utente
Foto UtenteCandy
32,5k 7 10 13
CRU - Account cancellato su Richiesta utente
 
Messaggi: 10123
Iscritto il: 14 giu 2010, 22:54

0
voti

[5] Re: Conversione stringe Gps

Messaggioda Foto Utentericello9 » 30 lug 2012, 13:32

Ho provato a scrivere il codice per la divisione della stringa,
Codice: Seleziona tutto
void conversione2(void){

unsigned int coordinata[]={1,4,5,4,9,'.',3,9,1,7};
unsigned int stringa_dei_gradi[4];
unsigned int stringa_dei_decimali[3];
unsigned int r=0;
unsigned int s=0;

for(r=0;r<=4 && coordinata[r]!='.' ;r++)
   stringa_dei_gradi[r]=coordinata[r];

for(s=0;s<=3 ;s++)       
   stringa_dei_decimali[s]=coordinata[s+r+1];
}


Può andare?
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

2
voti

[6] Re: Conversione stringe Gps

Messaggioda Foto UtentePaolino » 30 lug 2012, 13:45

Io avrei utilizzato un while():

Codice: Seleziona tutto
char index;
char *stringa_dei_dati;
iindex = 0;
while (coordinata[index]!='.')
{
    stringa_dei_gradi[index] = coordinata[index];
    index ++;
}
stringa_dei_gradi[index] ='\0';


Analogamente per quella dei decimali.

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

[7] Re: Conversione stringe Gps

Messaggioda Foto Utentericello9 » 30 lug 2012, 15:23

Codice: Seleziona tutto
    char index;
    char *stringa_dei_dati;
     index = 0;
     cont=0;

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

    while (coordinata[index+1]!=',')
    {
        stringa_dei_decimali[cont] = coordinata[index+1];
        index ++;
        cont++;
    }
   



Non riesco a capire un paio di cose:
1) come mai usi un puntatore per la variabile stringa_dei_dati
2) sono due variabili distinte "stringa_dei_dati" e "stringa_dei_gradi" o c'è un errore di battitura
2)come mai dopo il ciclo while scrivi il valore'/0' nella varibile "stringa_dei_gradi"

Se non ho capito male il ciclo while ad ogni iterazione copia il valore di coordinata nella varibile stringa_dei_gradi fino a quando non incontra il valore '.';continuanto ad incrementa il valore index.
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

2
voti

[8] Re: Conversione stringe Gps

Messaggioda Foto UtentePaolino » 31 lug 2012, 12:36

Ok, vediamo le risposte:
1) c'è un refuso (e l'hai beccato :mrgreen: :ok:)
Il codice corretto è:
Codice: Seleziona tutto
char index;
char * stringa_dei_gradi;
iindex = 0;
while (coordinata[index]!='.')
{
    stringa_dei_gradi[index] = coordinata[index];
    index ++;
}
stringa_dei_gradi[index] ='\0';


2) Il terminatore '\0' è il NULL che ci va ad ogni fine stringa. Obbligatorio, per il C.

ricello9 ha scritto:Se non ho capito male il ciclo while ad ogni iterazione copia il valore di coordinata nella varibile stringa_dei_gradi fino a quando non incontra il valore '.';continuanto ad incrementa il valore index.

Hai capito bene, funziona proprio così. Pertanto, se la stringa coordinata valesse "4456.12345", all'uscita del while la variabile index vale 4 e non 3, quindi mi trovo in stringa_dei_gradi il valore "4456" + il NULL.

Nel ciclo while le istruzioni eseguite sono:
index = 0 -> coordinata[0]='4' -> stringa_dei_gradi[0]='4' -> index++;
index = 1 -> coordinata[1]='4' -> stringa_dei_gradi[1]='4' -> index++;
index = 2 -> coordinata[2]='5' -> stringa_dei_gradi[2]='5' -> index++;
index = 3 -> coordinata[3]='6' -> stringa_dei_gradi[3]='6' -> index++;
index = 4 -> coordinata[4]='.' -> SI ESCE DA while().

Al valore di indice 4 si pone il NULL:
stringa_dei_gradi[4] = NULL;

Attenzione: a partire da qui puoi fare il parsing della "coordinata" ed estrarre il valore di stringa_dei_decimali. Pensaci e prova a buttare giù un'idea. Poi se ne parla.

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

[9] Re: Conversione stringe Gps

Messaggioda Foto Utentericello9 » 31 lug 2012, 13:06

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[index] ='\0';


//in uscita dal ciclo while incremento di una unità il valore di index così nel successivo
//ciclo while trascuro il carattere '.'
//creo un altro ciclo while dove continuo ad incrementare il valore di index ad ogni
//iterazione,copiando il valore della coordinata nell'array "stringa dei decimali" con
//indice la variabile "pos" che parte da zero.
// Il ciclo while termina quando trovo il carattere '.'
index = 5 -> coordinata[5]='1' -> stringa_dei_decimali[0]='1' -> index++ -> pos++;
index = 6 -> coordinata[6]='2' -> stringa_dei_decimali[1]='2' -> index++ -> pos++;
index = 7 -> coordinata[7]='3' -> stringa_dei_decimali[2]='3' -> index++ -> pos++;
index = 8 -> coordinata[8]='4' -> stringa_dei_decimali[3]='4' -> index++ -> pos++;
index = 9 -> coordinata[9]=',' -> SI ESCE DA while()

//come ultima operazione scrive il carattere NULL
stringa_dei_decimali[9]=NULL
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

2
voti

[10] Re: Conversione stringe Gps

Messaggioda Foto UtentePaolino » 31 lug 2012, 13:37

Direi che ci siamo. L'unica cosa è che questa riga:

Codice: Seleziona tutto
stringa_dei_decimali[index] ='\0';

deve diventare:

Codice: Seleziona tutto
stringa_dei_decimali[pos] ='\0';


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)

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti