/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
NMEA parser med C
Fra : Flemming Hansen


Dato : 19-03-06 21:36

Hej,

I forbindelse med et projekt skal vi lave en GPS modtager. Vi har en GPS
modul, som sender NMEA "sætninger" gennem serial port. Et eksempel:

$GPGGA,123519,4807.038,N,01131.324,E,1,08,0.9,545.4,M,46.9,M,,*42

Komma (,) skelner forskellige informationer. Jeg har kigget på nogle "NMEA
parser" koder, men det er godt nok svært at overskue, for der bruges struct,
hvor nogle elementer blev defineret som en anden struct osv. Og da der en
del filer, bliver man forvirret af funktionskald frem og tilbage. Hvad ville
I foreslår til en som lige er blevet færdig med "nybegynder" fasen? :)
Værdierne skal vist sættes ind i en struct, men hvordan skal jeg trække
værdierne uf af "sætningen"?

Tak på forhånd



 
 
Kent Friis (19-03-2006)
Kommentar
Fra : Kent Friis


Dato : 19-03-06 21:53

Den Sun, 19 Mar 2006 21:35:32 +0100 skrev Flemming Hansen:
> Hej,
>
> I forbindelse med et projekt skal vi lave en GPS modtager. Vi har en GPS
> modul, som sender NMEA "sætninger" gennem serial port. Et eksempel:
>
> $GPGGA,123519,4807.038,N,01131.324,E,1,08,0.9,545.4,M,46.9,M,,*42
>
> Komma (,) skelner forskellige informationer. Jeg har kigget på nogle "NMEA
> parser" koder, men det er godt nok svært at overskue, for der bruges struct,
> hvor nogle elementer blev defineret som en anden struct osv. Og da der en
> del filer, bliver man forvirret af funktionskald frem og tilbage. Hvad ville
> I foreslår til en som lige er blevet færdig med "nybegynder" fasen? :)
> Værdierne skal vist sættes ind i en struct, men hvordan skal jeg trække
> værdierne uf af "sætningen"?

Den dovne løsning er nok fscanf.

Og så skal folk nok komme med en million gode grunde til ikke at
bruge den...

Mvh
Kent
--
Hard work may pay off in the long run, but laziness pays off right now.

Michael Rasmussen (19-03-2006)
Kommentar
Fra : Michael Rasmussen


Dato : 19-03-06 22:46

On Sun, 19 Mar 2006 21:35:32 +0100, Flemming Hansen wrote:

> hvordan skal jeg trække værdierne uf af "sætningen"?
Jeg ville implementere en tilstandsmaskine.
http://en.wikipedia.org/wiki/Finite_state_machine

--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Kåre (15-04-2006)
Kommentar
Fra : Kåre


Dato : 15-04-06 20:12


"Michael Rasmussen" <mir@miras.org> skrev i en meddelelse
news:pan.2006.03.19.21.45.57.294785@miras.org...
> On Sun, 19 Mar 2006 21:35:32 +0100, Flemming Hansen wrote:
>
>> hvordan skal jeg trække værdierne uf af "sætningen"?
> Jeg ville implementere en tilstandsmaskine.
> http://en.wikipedia.org/wiki/Finite_state_machine
>
> --
> Hilsen/Regards
> Michael Rasmussen
> http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917

Meget sjovt, men det er ikke sikkert, at en som lige har overstået
begynderfasen kan gennemsue din joke...

scanf/sscanf funktionen benyttes til at formattere en ASCII streng med flere
værdier til tal. Prøv at slå op i en C bog, eller søg på scanf på google.

I princippet går det bare ud på at søge efter kommaer i strengen, og så dele
den store streng op i mindre strenge, som hver især kan konverteres til et
tal.

følgende funktioner kan også være nyttige. De benyttes til at konvertere et
enektl tal i ASCII format til en værdi.:

atof = ASCII to float
atoi = ASCII to integer

mvh
Kåre



JohnK (28-05-2006)
Kommentar
Fra : JohnK


Dato : 28-05-06 12:28

Hejsa,

Lidt input:
Jeg ville mene at at der skal skrives et par linier kode, som byte-for-byte
processer den modtagne karakter, og udfra de programmerede modtagne ord,
sætter de respektive variabler. Dette har jeg da selv lavet flere gange!
Altså en statemaskine der byte-for-byte bliver fodret med den modtagne
streng, og så når alt er OK (CMD, end-of-command sov osv) signalerer til
applikationen (eller hvem der måtte ønske dette) at nu er der nye
oplysninger klar!

Opdel det i funktioner ...
- en fnc der modtager fra uart ...
- en fnc der processer byte-by-byte, det der er modtaget
- dette er en statemaskine som finder
- kommandofelt (her sættes formatet for de efterfølgende),
- seperator,
- værdi1,
- værdi2 osv (ifht cmd der modtages)
- csum

En ny state for hver nyt felt ...
Desuden skal der kodes handle_date(), handle_time(), handle_position() osv
osv
Disse kaldes så fra det sted i statemaskinen (switch-case'n) hvor man
detekterer f.eks 'nu-har-vi-position' ... altså konverter det modtagne til
en local-variable.

Nogle detekterer først kommandoen, derefter er der een func() per kommando
der kan modtages, andre vælger at konverterer en hel string (som med scanf),
nogle igen tager byte-for-byte og konverterer hen-ad-vejen' .... så der er
flere approaches ....


Der er talrige exemple på dette ude på nettet.
google lidt omkring "nmea.c" eller "gps.c" "parser" osv osv
eks.:
*Nix -> http://pe1chl.xs4all.nl/Softw/nmea.c
-->
http://hubbard.engr.scu.edu/embedded/avr/avrlib/docs/html/nmea_8c-source.html

Sorceforged har sikkert talrige projekter, hvori der indgår gps/nmea
alternativt .. .drop mig et email, så skal jeg se hvad jeg har liggende.

(scanf mfl processer baseret en hel streng)


Der er desuden det aspekt at man skal kunne være fejltolerant når man
modtager 'udefra' .. Jeg ved ikke om det samme gælder i din applikation.


>
> Meget sjovt, men det er ikke sikkert, at en som lige har overstået
> begynderfasen kan gennemsue din joke...

Jeg tror ikke det var en joke - dette bruges af alle (næsten) der arbejder
med protokoller

>
> scanf/sscanf funktionen benyttes til at formattere en ASCII streng med
> flere værdier til tal. Prøv at slå op i en C bog, eller søg på scanf på
> google.
>
> I princippet går det bare ud på at søge efter kommaer i strengen, og så
> dele den store streng op i mindre strenge, som hver især kan konverteres
> til et tal.

Enig! Men da der er forskelle for hver eneste NMEA kommando, skal der er en
lille statemaskine til at processerer disse!

/johnk



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste