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