PDA

View Full Version : [C#] Leggere latitudine e longitudine su GPS


pare93
15-10-2011, 18:18
Salve a tutti,

ho fatto diverse ricerche in rete ma non sono riuscito a trovare poco niente che mi permettesse interfacciare un PC Windows con il GPS.

Il linguaggio di programmazione che conosco meglio è il C# quindi cercavo qualche libreria in rete già fatta. Il mio scopo è quindi di leggere da un navigatore satellitare ( nel mio caso MIO C250 ) la longitudine e la latitudine della mia posizione attuale.

Ho pensato anche ad un collegamento ad internet quindi attraverso Google Maps, ma il problema è che mi servono dai aggiornati in pratica in modo instantaneo e una connessione ad internet non penso che risolvi questo problema.

Qualcuno ha già affrontato questo tipo di problema o conosce una libreria per interfacciare il C# ad un GPS esterno ?

Grazie.

tomminno
15-10-2011, 19:44
Generalmente i moduli GPS inviano stringhe NMEA tramite RS232.
Tutto sta nel capire come il tuo device comunichi (se lo fa) le informazioni sulla posizione all'esterno.

pare93
16-10-2011, 00:04
Si, esatto è quello il problema che bisogna vedere a monte di tutto.
Il fatto è che sinceramente non ho idea di come leggere l' I/O in una porta seriale.

LMCH
16-10-2011, 01:55
Il fatto è che sinceramente non ho idea di come leggere l' I/O in una porta seriale.

Per molte questioni simili, cercare su MSDN toglie parecchi dubbi e fornisce risposte più rapidamente che a chiedere sui forum:
http://msdn.microsoft.com/it-it/library/system.io.ports.serialport.aspx
Se hai dubbi, l'esempio alla fine della pagina di documentazione dovrebbe chiarire tutto.

pare93
16-10-2011, 09:41
Ok grazie per la ricerca ma l' avevo già trovata quella libreria il fatto è che non ho la possibilità di usarla visto che, come ho detto ho un MIO C250, ho solo a disposizione un interfaccia USB.

Ho pensato si acquistare un convertitore da USB a serial ma prima di fare questo vorrei vedere se riesco a comunicare con la porta USB.

E questo non è per niente semplice visto le notizie che sto ricavando da internet.

tomminno
16-10-2011, 11:19
Si, esatto è quello il problema che bisogna vedere a monte di tutto.
Il fatto è che sinceramente non ho idea di come leggere l' I/O in una porta seriale.

Guarda che devi prima trovare la documentazione su come il tuo navigatore comunica all'esterno le informazioni sulla posizione (se mai avesse questa funzionalità generalmente non disponibile sui navigatori).
E' probabile che tu debba interfacciarti con qualche software proprietario del navigatore installato sul tuo computer per comunicarci (tipo oggetti COM).
Ma senza avere queste informazioni è impossibile darti una indicazione su come procedere.

LMCH
16-10-2011, 16:34
Ok grazie per la ricerca ma l' avevo già trovata quella libreria il fatto è che non ho la possibilità di usarla visto che, come ho detto ho un MIO C250, ho solo a disposizione un interfaccia USB.

Ho pensato si acquistare un convertitore da USB a serial ma prima di fare questo vorrei vedere se riesco a comunicare con la porta USB.

E questo non è per niente semplice visto le notizie che sto ricavando da internet.

Ah! Avevo capito male, da quel che era stato scritto prima sembrava implicito che avesse una porta seriale.

Ho dato un occhiata alle specifiche del tuo navigatore ed ho visto che usa Windows CE (Windows CE .NET 4.2, precedente a Windows CE 5.0) , quindi probabilmente la porta USB serve solo per connettersi con ActiveSync al PC.

In teoria potresti scrivere un programma per CE da far girare sul navigatore che faccia da proxy verso il pc, ma non credo ne valga la pena, specialmente perchè nonostante il nome del S.O. dubito che ci sia il .Net framework preinstallato.

pare93
17-10-2011, 17:27
E proprio quello che stavo ipotizzando. Anche secondo me il navigatore non invia pacchetti contenenti la mia posizione.

In teoria potresti scrivere un programma per CE da far girare sul navigatore che faccia da proxy verso il pc, ma non credo ne valga la pena, specialmente perchè nonostante il nome del S.O. dubito che ci sia il .Net framework preinstallato.

Scrivere una programma per la piattaforma CE potrebbe essere un ottima soluzione ma la scarterei visto che, a prescindere dal fatto che porterebbe via molto tempo, questo software deve essere utilizzato anche per altri dispositivi di ricezione GPS.
Quindi nel caso riuscissi a sviluppare un software, questo andrebbe bene solo per navigatori che lavorano su piattaforma CE.

Facendo ricerche in rete, ho quindi ipotizzato l' acquisto di un rucevitore USB di segnale GPS.
Ho letto che i dispositivi di questo genere sono stati progettati per interfecciare con il pc attraverso un software di terze parti.
Ma il mio scopo era quello di crearmelo da me il software. Quindi mi chiedevo se questa tipologia di dispositi invia informazzioni rigurdanti la mia posizione attraverso USB, che quindi posso leggere attraverso un software creato da me.

Posto uno dei tanti link che ho trovato in rete per dare un idea della pennetta di cui sto parlando :
http://www.engadget.com/2007/09/19/i-o-data-intros-navi-clip-usb-gps-device/

pare93
22-10-2011, 15:26
up

british
23-10-2011, 15:37
Ma il mio scopo era quello di crearmelo da me il software. Quindi mi chiedevo se questa tipologia di dispositi invia informazzioni rigurdanti la mia posizione attraverso USB, che quindi posso leggere attraverso un software creato da me.


Certo. Come ti diceva tomminno poco sopra, questi ricevitori tipicamente inviano informazioni di posizione (e molto altro) sottoforma di frasi secondo la specifica NMEA-0183 (http://en.wikipedia.org/wiki/NMEA_0183).

ciao!

british

pare93
26-10-2011, 19:41
Ok , il ricevitore GPS penso che ce l avrò tra breve.

Intanto volevo anche chiedere se qualcuno sa come inserire una sorta di mappa geografica in una visual form in c#.

Premetto che non ho ancora cercato nulla in rete a riguardo, pongo questa domanda a chi magari ha una risposta immediata.

!fazz
27-10-2011, 13:12
E proprio quello che stavo ipotizzando. Anche secondo me il navigatore non invia pacchetti contenenti la mia posizione.



Scrivere una programma per la piattaforma CE potrebbe essere un ottima soluzione ma la scarterei visto che, a prescindere dal fatto che porterebbe via molto tempo, questo software deve essere utilizzato anche per altri dispositivi di ricezione GPS.
Quindi nel caso riuscissi a sviluppare un software, questo andrebbe bene solo per navigatori che lavorano su piattaforma CE.

Facendo ricerche in rete, ho quindi ipotizzato l' acquisto di un rucevitore USB di segnale GPS.
Ho letto che i dispositivi di questo genere sono stati progettati per interfecciare con il pc attraverso un software di terze parti.
Ma il mio scopo era quello di crearmelo da me il software. Quindi mi chiedevo se questa tipologia di dispositi invia informazzioni rigurdanti la mia posizione attraverso USB, che quindi posso leggere attraverso un software creato da me.

Posto uno dei tanti link che ho trovato in rete per dare un idea della pennetta di cui sto parlando :
http://www.engadget.com/2007/09/19/i-o-data-intros-navi-clip-usb-gps-device/

se posso dirti la mia visto che con i gps ci ho lavorato parecchio

1) il gps comunica tramite messaggi seriali su porta seriale al 99% anche un ricevitore usb non sarà altro che una virtual com quindi il programma che farai andrà comunque a leggere su seriale
2) se vuoi un consiglio spassionato senza sbatterti più di tanto compra una antenna garmin gps 18x PC (OCCHIO non la versione usb ma quella seriale) che trasmette in standard nmea così non avrai sbattimenti di sorta

https://www.distrelec.it/ishop/ImagesProduct/stibo/t_890088f.jpg

costa mi pare sui 90$ in america 110€ in italia

per la programmazione il c# ha tutto per la gestione della porta seriale senza troppi sbattimenti

http://msdn.microsoft.com/it-it/library/system.io.ports.serialport.aspx

comunque con qualsiasi linguaggio gestire il gps nmea è una cavolata basta leggere la seriale a righe

io ad esempio su pc lavoravo offline da s.o. loggavo tutto il traffico (su windows ad esempio potresti usare putty) e analizzavo il log tramite un semplice parser fatto su windows con c#

per l'utilizzo online avevo dovuto fare un giro strano per questione di tempi ciclo rs232--> CAN con c++, qt e un framework particolare su embedded can-->centralina con matlab rtw--> output di test su pc

per la mappa guarda qui

http://code.google.com/p/winforms-geplugin-control-library/

pare93
28-10-2011, 20:48
Ok, grazie mille per la dritta.

Come modulo GPS mi sto muovendo per acquistare il NAVI-S-U6 versione USB. Ho letto che è un ricevitore preciso e molto preciso, quindi mi sono fidato della recensione.
Cosa ne pensi di questo dispositivo ?

Sul lato della programmazione per ora non posso fare niente, se non incominciare a documentarmi, visto che non ho ancora a disposizione il ricevitore.
Ad ogni modo hai ragione, non deve essere un operazione così difficile programmarlo. Inizierei facendo uno sniffing dei dati che il modulo invia al calcolatore in modo da essere sicuro riguardo al protocollo utilizzato e ai messaggi inviati.

Riguardo la soluzione che mi hai proposto riguardo la mappa penso che non sia male. Ora, non ho letto tutta la documentazione ma già dal titolo GOOGLE EARTH penso che richieda una connessione ad internet. E voglio ricordare che il mio lavoro si deve svolgere offline riguardo al modulo GPS. Peró, ripeto, non ho letto tutta la documentazione.

Comunque vi tengo aggiornati sui miei progressi. Grazie.

pare93
31-10-2011, 12:01
Uo

!fazz
03-11-2011, 12:26
Ok, grazie mille per la dritta.

Come modulo GPS mi sto muovendo per acquistare il NAVI-S-U6 versione USB. Ho letto che è un ricevitore preciso e molto preciso, quindi mi sono fidato della recensione.
Cosa ne pensi di questo dispositivo ?

Sul lato della programmazione per ora non posso fare niente, se non incominciare a documentarmi, visto che non ho ancora a disposizione il ricevitore.
Ad ogni modo hai ragione, non deve essere un operazione così difficile programmarlo. Inizierei facendo uno sniffing dei dati che il modulo invia al calcolatore in modo da essere sicuro riguardo al protocollo utilizzato e ai messaggi inviati.

Riguardo la soluzione che mi hai proposto riguardo la mappa penso che non sia male. Ora, non ho letto tutta la documentazione ma già dal titolo GOOGLE EARTH penso che richieda una connessione ad internet. E voglio ricordare che il mio lavoro si deve svolgere offline riguardo al modulo GPS. Peró, ripeto, non ho letto tutta la documentazione.

Comunque vi tengo aggiornati sui miei progressi. Grazie.

non lo conosco personalmente ma ho visto che usa un ricevitore ublox che non sono male, hanno un ottima sensibilità tale che in alcuni casi funzionano anche indoor e ha il protocollo nmea se riesci a leggerlo via seriale sei a cavallo

da quanto mi ricordo gli ublox sono caretti come receiver, sono il modulo da integrare veniva sui 90€ un paio di anni fà contro i 30 di un sirfstarIII ma se il ricevitore ha un prezzo buono direi che è una buona scelta

riguardo la decodifica è una cavola immane farla

a titolo di esempio guarda questo estratto di un log nmea, quello che ti interessa è incluso nella sentences GPGGA quindi scarti tutte le righe lette che non iniziano con $GPGGA e nella riga trovi latitudine (rosso) longitudine (blu) e altitudine (verde), il numero che ti ho indicato in marrone è un indicatore della qualità della misura se è 0 significa che la misura non è valida, 1 fix gps , 2 fix dgps, 3, uso del canale cifrato(che ormai non si usa più), 4 uso di rtk e quindi massima precisione ottenibile (< 1 cm) ecc ecc


come vedi è semplicissimo basta leggere la seriale a righe e splittare la stringa usando come separatore la , una roba che ad impiegarci tanto impieghi 5 minuti comprensivo di pausa caffè



$GPRMC,101452,A,4531.6589,N,00934.6529,E,000.0,000.0,031109,001.0,E*79

$GPGGA,101452,4531.6589,N,00934.6529,E,2,10,0.8,124.4,M,46.7,M,,*4A

$GPGSA,A,3,02,05,10,12,14,16,21,29,30,31,,,1.3,0.8,1.0*37

$PGRME,2.4,M,2.4,M,3.4,M*29

$GPVTG,000.0,T,359.0,M,000.0,N,0000.0,K*71

$GPRMC,101453,A,4531.6589,N,00934.6529,E,000.0,000.0,031109,001.0,E*78

$GPGGA,101453,4531.6589,N,00934.6529,E,2,10,0.8,124.4,M,46.7,M,,*4B

$GPGSA,A,3,02,05,10,12,14,16,21,29,30,31,,,1.3,0.8,1.0*37

$PGRME,2.4,M,2.4,M,3.4,M*29

$GPVTG,000.0,T,359.0,M,000.0,N,0000.0,K*71

$GPRMC,101454,A,4531.6589,N,00934.6529,E,000.0,000.0,031109,001.0,E*7F

$GPGGA,101454,4531.6589,N,00934.6529,E,2,10,0.8,124.4,M,46.7,M,,*4C

$GPGSA,A,3,02,05,10,12,14,16,21,29,30,31,,,1.3,0.8,1.0*37

$PGRME,2.4,M,2.4,M,3.4,M*29

$GPVTG,000.0,T,359.0,M,000.0,N,0000.0,K*71

$GPRMC,101455,A,4531.6589,N,00934.6529,E,000.0,000.0,031109,001.0,E*7E

$GPGGA,101455,4531.6589,N,00934.6529,E,2,10,0.8,124.4,M,46.7,M,,*4D

$GPGSA,A,3,02,05,10,12,14,16,21,29,30,31,,,1.3,0.8,1.0*37

$PGRME,2.4,M,2.4,M,3.4,M*29

$GPVTG,000.0,T,359.0,M,000.0,N,0000.0,K*71

$GPRMC,101456,A,4531.6589,N,00934.6529,E,000.0,000.0,031109,001.0,E*7D

$GPGGA,101456,4531.6589,N,00934.6529,E,2,10,0.8,124.4,M,46.7,M,,*4E

$GPGSA,A,3,02,05,10,12,14,16,21,29,30,31,,,1.3,0.8,1.0*37

$PGRME,2.4,M,2.4,M,3.4,M*29

$GPVTG,000.0,T,359.0,M,000.0,N,0000.0,K*71

$GPRMC,101457,A,4531.6589,N,00934.6529,E,000.0,000.0,031109,001.0,E*7C

$GPGGA,101457,4531.6589,N,00934.6529,E,2,10,0.8,124.4,M,46.7,M,,*4F

$GPGSA,A,3,02,05,10,12,14,16,21,29,30,31,,,1.3,0.8,1.0*37

$PGRME,2.4,M,2.4,M,3.4,M*29





ps scusa per il ritardo ma ero senza internet negli scorsi giorni

pare93
03-11-2011, 19:50
Innanzitutto vorrei ringraziarti per il tuo interessamento.

Poi ti ringrazio per avermi postato un log di quello che viene letto dalla seriale.
Mi hai sicuramente risparmiato un lavoro.

Ho un ultimo dubbio che mi sorge non avendo a disposizione in questo momento il modulo. La connessione seriale di cui stiamo parlando è stata virtualizzata nella connessione USB giusto ?
Quindi questo mi permette di leggere il port USB come un RS232 ?

british
03-11-2011, 21:10
Inizierei facendo uno sniffing dei dati che il modulo invia al calcolatore in modo da essere sicuro riguardo al protocollo utilizzato e ai messaggi inviati.

Questo lo fai molto facilmente aprendo la COM di tuo interesse con un software come Termite (su windows) o un semplice "cat /dev/ttyS0" su linux.


Riguardo la soluzione che mi hai proposto riguardo la mappa penso che non sia male. Ora, non ho letto tutta la documentazione ma già dal titolo GOOGLE EARTH penso che richieda una connessione ad internet. E voglio ricordare che il mio lavoro si deve svolgere offline riguardo al modulo GPS. Peró, ripeto, non ho letto tutta la documentazione.

Se non puoi collegarti a internet temo tu sia un po' fregato. Le mappe offline mi pare si comprino a carissimo prezzo.

ciao!

british

british
03-11-2011, 21:11
Innanzitutto vorrei ringraziarti per il tuo interessamento.

Poi ti ringrazio per avermi postato un log di quello che viene letto dalla seriale.
Mi hai sicuramente risparmiato un lavoro.

Ho un ultimo dubbio che mi sorge non avendo a disposizione in questo momento il modulo. La connessione seriale di cui stiamo parlando è stata virtualizzata nella connessione USB giusto ?
Quindi questo mi permette di leggere il port USB come un RS232 ?

Di solito ti appare una nuova COM virtuale.

ciao!

british

british
03-11-2011, 21:14
per la mappa guarda qui

http://code.google.com/p/winforms-geplugin-control-library/

Questo è interessantissimo. Per caso conosci anche qualcosa di orientato al C++?

ciao!

british

!fazz
04-11-2011, 10:01
Innanzitutto vorrei ringraziarti per il tuo interessamento.

Poi ti ringrazio per avermi postato un log di quello che viene letto dalla seriale.
Mi hai sicuramente risparmiato un lavoro.

Ho un ultimo dubbio che mi sorge non avendo a disposizione in questo momento il modulo. La connessione seriale di cui stiamo parlando è stata virtualizzata nella connessione USB giusto ?
Quindi questo mi permette di leggere il port USB come un RS232 ?

il modulo non lo conosco ma di solito la soluzione più semplice ed utilizzata è la virtual com ovvero la usb non è altro che un adattatore usb-->rs232 e tu vedi il dispositivo come una porta com non come usb che spara in continuazione righe di testo

(nel mio caso era cablato rs232: il garmin di prima)

Questo è interessantissimo. Per caso conosci anche qualcosa di orientato al C++?

ciao!

british

era un googlata, non l'ho mai usato google maps, noi usavamo una grafica generata

pare93
06-11-2011, 12:57
OK, grazie mille vi tengo aggiornati per eventuali progressi !

bovolone
20-12-2011, 01:46
Ciao ti consiglio questi link di seguito, dovi trovi tutte le informazioni in italiano per implementare un'applicazione c# che riceve ed interpreta i dati ricevuti dal GPS.
Saluti

http://www.miisoft.it/portale/index.php/programmazione/37-c/51-gps-parte-i

http://www.miisoft.it/portale/index.php/programmazione/37-c/53-gps-parte-ii

http://www.miisoft.it/portale/index.php/programmazione/37-c/55-gps-parte-iii