Bepaalde delen uit seriele communicatie halen in bascom en laten zien op LCD

Voor mijn eindwerk moet ik een gps programmeren en de locatie kunnen laten zien op een display in bascom.

$GPRMC,171932.000,A,5102.9541,N,00520.8263,E,0.00,53.20,230513,,,A*54
$GPGGA,171933.000,5102.9541,N,00520.8263,E,1,05,2.5,39.1,M,47.4,M,,0000*6B
$GPGSA,A,3,25,31,02,12,29,,,,,,,,4.3,2.5,3.6*38

ik heb de gpgga regel nodig. ik heb het zover gekregen dat deze enkel de regel gebruikt, maar hoe krijg ik het zover dat ik de coördinaten kan gebruiken en uitlezen op de lcd?

Je bent al op de goede weg. Ik lees dat je de regel al weet te isoleren die je zoekt. Zoals ik het begrijp heb je alleen nog moeite om de coördinaten naar het LCD te sturen. De reden waarom is nog onduidelijk.

Heb je dan problemen met :
1) waar de codering voor de locatie zit ?
2) de volledige (lange) regel naar het scherm te krijgen ?
3) het commando hoe je een tekst naar een LCD stuurt ?
4) hoe je met de getallen / coördinaten moet rekenen ?

Kortom, indien je iets specifieker aangeeft waar het knelpuntje zit, kan er beter geantwoord worden door de lezers.

Van elk bezoek aan CO leer ik weer meer...

Volgens mij is de TS vooral aan het ploeteren om de door komma's gescheiden strings op te splitsen.
Zelf doe ik dit in C door simpelweg karakter voor karakter de regel door te stappen en te kijken of mijn huidige karakter al dan niet een komma is. Zo nee, dan kopieer ik het karakter naar mijn variabele (uiteraard ook een string), welke ik vervolgens kan bewerken of simpelweg opslaan. Zo ja, dan heb ik een volledige "string" uitgelezen en kan ik zoeken naar de volgende.
In Basic (en vast ook in C, maar dat levert ongetwijfeld een stuk meer overhead op dan mijn quick-and-dirty oplossing) is er echter vast een makkelijker commando voor :)

Zo goed als het vroeger was, is het nooit geweest.

Oei dat project kwam ik van t weekend volgens mij nog tegen.op mijn laptop van jaren terug.
Stuur me anders even een.mailtje ter herinnering, dan zoek ik van t weekend de code ff op. Maar volgens mij deed ik t ook net als TommyBoy.

[Bericht gewijzigd door Stijnos op vrijdag 24 mei 2013 08:48:32 (12%)

EricP

mét CE

In C pak je strtok. Lomp, maar effectief.

Wat een idiote interface heeft die strtok() functie zeg, de eerste keer geef je een pointer naar een string, en elke volgende call op dezelfde string geef je een null pointer mee, omdat hij intern opslaat (in een static variabele, lijkt me) waar hij gebleven is. Dat betekend dus dat het grandioos mis kan gaan als je tussen calls naar strtok() ook andere function calls doet, als in een van die functies toevallig ook strtok() wordt gebruikt. Waarom hebben ze er geen char** argument van gemaakt, zodat de pointer naar de huidige plaats in de string gewoon op de stack van de aanroepende functie kan blijven?

@TS: is je eindwerk nu serieus het ontvangen en doorgeven van een paar bytes van een GPS ontvanger naar een display, zonder enige vorm van bewerking?

De stappen lijken me op zich vrij simpel; zodra je een carriage return of line feed ontvangt, bekijk je de ontvangen karakters, en dan eerst of de eerste 6 karakters kloppen met de regel die je wilt ontvangen. Zo ja, dan ga je die regel verwerken, en daarna maak je je ontvangstbuffer leeg, zodat het eerstvolgende karakter (eerste teken van de volgende regel) weer vooraan in het buffer komt.

Bij het verwerken tel je het aantal komma's tot het eerste veld dat je wilt lezen, net zoals je dat zelf doet als je probeert de coordinaten uit de string te halen. Vervolgens kopieer je alle karakters tot de eerstvolgende komma.

Het is wel belangrijk om erop te letten dat het mogelijk is dat er helemaal geen data tussen die komma's staat, als je nog geen GPS fix hebt, dat er door een of andere fout te weinig komma's in de regel staan, of dat de regel veel langer is dan je verwacht, en dus groter dan het buffer dat je beschikbaar hebt.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Frederick E. Terman

Honourable Member

Laat je in elk geval niet verleiden tot gewoon maar de karakters af te tellen. Je weet nl. niet (of althans, je moet doen alsof je niet weet) hoe groot de velden tussen de komma's zijn.
Bv. een coördinaat kan 2, 3, of 4 cijfers achter de decimale punt hebben.

e: Leuk huis trouwens, maar wat is daar nu naast gebouwd een paar jaar geleden? :)

[Bericht gewijzigd door Frederick E. Terman op zaterdag 25 mei 2013 00:02:25 (14%)

Keramisch, kalibratie, parasitair: woordenlijst.org

Ik mis nog steeds een reactie van TS, over wat zijn probleem nu is. In mijn vorige posting had ik eerst de hele Bascom-broncode voor het probleem neergekalkt. Totdat ik bedacht dat het om z'n eindwerk ging en dus een schoolvraag is. En bij nadere bestudering, dat niet duidelijk is waar nu werkelijk het struikelblok ligt.
Kortom, broncode weer geschrapt om vervolgens de TS vragen om na te laten denken over waar hij / zij vastloopt.
Het is immers de bedoeling dat we bij een schoolvraag de TS leren een probleem op te lossen. Dat doe je niet door meteen de broncode mee te geven. Is natuurlijk handig voor de TS, maar niet leerzaam.

Mijn verzoek is dan ook om het hobbyenthousiasme bij ons (CO'ers) te temperen en de TS juist proberen te "prikkelen" tot verder nadenken door stapsgewijs hints te verstrekken.
Kortom, TS heeft het startgedeelte in handen en weet wat zijn einddoel moet zijn. Nu nog leren het tussendeel in stukjes te knippen. Dat doen ze -dacht ik- in het onderwijs ook zo.

[Bericht gewijzigd door oxurane op zaterdag 25 mei 2013 02:04:36 (10%)

Van elk bezoek aan CO leer ik weer meer...

dit is zover mijn code maar ik zit telkens vast als ik de tijd of de coördinaten wil uitlezen

bascom code:


$regfile = "m16def.dat"
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2

Config Lcd = 16 * 2

Dim Gps As String * 10
Dim A As Integer
Dim B As Integer
Dim C As Integer
Dim D As Integer
Dim E As Integer
Dim F As Integer
Dim G As Integer
Dim H As Integer
Dim I As Integer
Dim J As Integer
Dim K As Integer
Dim L As Integer
Dim M As Integer
Dim Lat As String * 10
Dim Longi As String * 10
Dim N As String * 10
Dim O As String * 10


'Do
Cls
Home
Startloop:

'Locate 1 , 1


Gps = Waitkey()
'Lcd Gps                                                     '$GPGGA inlezen
If Gps <> "$" Then
 Goto Startloop
End If
Gps = Waitkey()
Lcd "$"
If Gps <> "G" Then
 Goto Startloop
End If
Gps = Waitkey()
Lcd "G"
If Gps <> "P" Then
 Goto Startloop
End If
Gps = Waitkey()
Lcd "P"
If Gps <> "G" Then
 Goto Startloop
End If
Gps = Waitkey()
Lcd "G"
If Gps <> "G" Then
Goto Startloop
End If
Gps = Waitkey()
Lcd "G"
If Gps <> "A" Then
 Goto Startloop
End If
Gps = Waitkey()
Lcd "A"
If Gps <> "," Then
 Goto Startloop                                             '$GPGGA, is nu ingelezen, nu coordinaten
End If
'Lcd "$GPGGA"


Do
For A = 1 To 6
   Lowerline                                                'tijd in uren,minuten,seconden
   Gps = Waitkey()
   Lcd Gps
   If A = 1 Then
       For B = 1 To 2
         Gps = Waitkey()
         Lcd Gps
       Next B
   Elseif A = 3 Then
       For C = 1 To 2
         Gps = Waitkey()
         Lcd Gps
       Next C
   Elseif A = 5 Then
        For D = 1 To 2
         Gps = Waitkey()
         Lcd Gps
       Next D
   End If
Next A

For E = 1 To 4                                              'indien er .xx sec komt
  Gps = Waitkey()
  Lcd Gps
  If Gps = "." Then
   For F = 1 To 2
      Gps = Waitkey()
      Lcd Gps
   Next F
  End If
  If Gps = "," Then
   Gps = Waitkey()
   Lcd Gps
  End If
Next E



Lowerline
Lcd "Lat="
Lcd Lat
For G = 1 To 5                                              'latitude inlezen
   Lat = Waitkey()
   Lcd Lat
   If Lat = "." Then
       Lat = Waitkey()
        Lcd Lat
        For H = 1 To 3
         If Lat = "," Then
          Goto Volgende
         End If
        Next H
   Elseif G = 1 Then
        For I = 1 To 2
          Lat = Waitkey()
          Lcd Lat
        Next I
   End If
Next G

Volgende:

For J = 1 To 2
   N = Waitkey()
   If N = "N" Then
      Lcd N
   Elseif N = "Z" Then
      Lcd N
   Elseif N = "," Then
      Lcd N
      Goto Nu
   End If
Next J

Nu:

Lowerline
Lcd "longi="
Lcd Longi                                                   'longitude
For K = 1 To 5
   Longi = Waitkey()
   Lowerline
   Lcd Longi
   If K = 1 Then
      For L = 1 To 2
        Longi = Waitkey()
        Lowerline
        Lcd Longi
      Next L
   Elseif Longi = "." Then
      Goto Nexte
   End If
 Next K
Nexte:

For M = 1 To 2
  O = Waitkey()
  If O = "O" Then
   Lcd O
  Elseif O = "W" Then
   Lcd O
   End If
Next M


Loop

End

[Bericht gewijzigd door Henry S. op woensdag 5 juni 2013 19:16:01 (0%)

Hoi,
Je schrijft:

code:


Dim A As Integer
Dim B As Integer
Dim C As Integer
...

en zo door totdat je meer dan de helft van het alfabet gebruikt hebt. Ik snap NU al niet meer waar abcdef voor staan. Hoe moet dat later?

Als er allemaal 'ongeveer hetzelfde' dingen in moeten, dan moet je een array pakken.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Gebruik gebufferde RS232:

============================================
' RS232BUFFER.BAS
' (c) 2000, MCS Electronics
'
Config Serialin = Buffered , Size = 20
Dim Name As String * 10
Enable Interrupts
Print "Start"
Do
Name = Inkey()
If Name <> "" Then
Print Name
End If
Wait 1
Loop
==============================================

Vervolgens kun je met de standaard string commando's zo je data eruit vissen.

It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.

Volgens mij kun je de "Waitkey()" beter niet gebruiken. Die zorgt ervoor dat je AVR in de tussentijd niets anders kan uitvoeren.

Volgens mij kun je beter om de zoveel tijd het UART-buffer uitlezen. Telkens kijk je of er een "$"-teken voorbij komt. Zodra die voorbij komt, dump je de eerstvolgende 5 binnenkomende karakters in een string-variabele. Zodra dat het geval is, kijk je of er dan "GPGGA" in staat.
Zo ja, dan ben je al een heel stuk op weg. Daarna komen er nog een paar stappen, maar als je dit al voor elkaar hebt, kun je de rest met wat denkwerk voor elkaar krijgen.

[Bericht gewijzigd door oxurane op woensdag 5 juni 2013 17:57:52 (38%)

Van elk bezoek aan CO leer ik weer meer...
klein is fijn

Moderator

Ik heb mijn GPS logger ook gewoon draaien met het Input commando, alles wat het ding moet doen wordt toch daardoor getriggerd.

Hier is een leuk stukje code:

bascom code:

Dim Nmea As String * 70
Dim Nmea_type As Word At Nmea + 5 Overlay       ' fifth and sixth char of nmea string, first char is newline char

Nmea_input:

  Input Nmea Noecho
  If Nmea_type <> 16711 Then Goto Nmea_input       ' word representation of "GA", first message
  Nmea_gga = Nmea_data

  ' do something with Nmea_gga data

Goto Nmea_input

Dit is maar een klein uitgekleed stukje, je kan hiermee uiteindelijk alle informatie achter elkaar inlezen (de NMEA strings komen altijd in dezelfde volgorde) en op een scherm zetten. In mijn testopstelling had ik een 240x64 grafisch display waarop ook de stand van de eerste 12 satelieten te zien waren.

http://www.kleinisfijn.nl/co/gps/gps_display_setup.jpg