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.
Conversione stringhe Gps
Moderatore:
Paolino
41 messaggi
• Pagina 1 di 5 • 1, 2, 3, 4, 5
3
voti
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.
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
-------------------------------------------------------------
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)
2
voti
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:
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.
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.
1
voti
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.
Per convertire un valore da reale a stringa puoi usare la comodissima funzione fprintf(); che è parte della libreria standard.
-

Candy
32,5k 7 10 13 - CRU - Account cancellato su Richiesta utente
- Messaggi: 10123
- Iscritto il: 14 giu 2010, 22:54
0
voti
Ho provato a scrivere il codice per la divisione della stringa,
Può andare?
- 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?
2
voti
Io avrei utilizzato un while():
Analogamente per quella dei decimali.
Ciao.
Paolo.
- 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
-------------------------------------------------------------
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
- 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.
2
voti
Ok, vediamo le risposte:
1) c'è un refuso (e l'hai beccato
)
Il codice corretto è:
2) Il terminatore '\0' è il NULL che ci va ad ogni fine stringa. Obbligatorio, per il C.
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.
1) c'è un refuso (e l'hai beccato
)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
-------------------------------------------------------------
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
- 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
2
voti
Direi che ci siamo. L'unica cosa è che questa riga:
deve diventare:
Ciao.
Paolo.
- 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
-------------------------------------------------------------
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)
41 messaggi
• Pagina 1 di 5 • 1, 2, 3, 4, 5
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 3 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)
