Sziasztok!
Kísérletezgetek egy gps vevővel, MTK3339 chip a lelke. Jönnek is az NMEA mondatok belőle szépen. Szobába is hamar talál vételt uh. megérte az árát. A kérdésem a feldolgozással kapcsolatos. Sok megoldást kipróbáltam már, sajátot, másét de még semmi nem adott teljesen hibátlan megoldást. A jelenlegi kód, ami a "legstabilabb" (kevés hibával dolgozik) a következő:
Kód: Egész kijelölése
$regfile = "m128def.dat"
$crystal = 11059200
$hwstack = 256
$swstack = 256
$framesize = 256
$lib "lcd-pcf8833BR2.lbx" 'special color display support
$lib "GetToken.Lib"
$external Gettoken
Config Graphlcd = Color , Controlport = Portc , Cs = 1 , Rs = 0 , Scl = 3 , Sda = 2
'######################## Színek definiálása ###################################
Const Blue = &B00000011
Const Yellow = &B11111100
Const Red = &B11100000
Const Green = &B00011100
Const Black = &B00000000
Const White = &B11111111
Const Brightgreen = &B00111110
Const Darkgreen = &B00010100
Const Darkred = &B10100000
Const Darkblue = &B00000010
Const Brightblue = &B00011111
Const Orange = &B11111000
'###############################################################################
Dim Strbytes(109) As Byte
Dim Gpsline As String * 108 At Strbytes(1) Overlay ' NMEA mondat tároló
Dim Strlen As Byte
Dim Index As Byte
Dim Chksum As Byte
Dim Gps_head As String * 5
Dim Gps_chksum As String * 2
Dim Gps_chksum_b As Byte
Dim Gps_data_flag As Byte ' GPS adat jelző
Dim Ch As String * 1
Dim X As Byte
Dim Z As Byte
Dim Z_s As String * 1
Dim Gpstime_s As String * 10
Dim Gpslat_s As String * 10
Dim Gpslon_s As String * 10
Dim We As String * 1
Dim Ns As String * 1
Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Com2 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin = Buffered , Size = 200 , Bytematch = 13 ' GPS Buffer
Declare Function Gettoken(strinput As String , Byval Bseparator As Byte , Byval Bcount As Byte ) As String
'######################### LCD Init ############################################
Glcdcmd &H21
Glcdcmd &H36
Glcddata &H48 '40 = RGB vagy 48 = BGR
'###############################################################################
Open "Com2:" For Binary As #2
Enable Interrupts
Print "Serial1 init"
Print #2 , "Serial2 init"
Cls
Setfont Color8x8
Lcdat 1 , 1 , "GPS Teszt" , Black , White
Wait 2
Cls
Lcdat 4 , 2 , "GPS Ido:" , Black , White
Lcdat 24 , 2 , "Szelesseg:" , Black , White
Lcdat 44 , 2 , "Hosszusag:" , Black , White:
do
If Gps_data_flag > 0 Then Gosub Processgps
Lcdat 14 , 2 , Gpstime_s , Black , White
Lcdat 34 , 2 , We ; " " ; Gpslon_s , Black , White
Lcdat 54 , 2 , Ns ; " " ; Gpslat_s , Black , White
loop
'=====[ Charage Return Detected ]==============================================
Serial0charmatch:
pushall
incr GPS_Data_Flag ' increment for each new GPS sentance.
popall
return
'------------------------------------------------------------------------------
'=====[ Process GPS ]==========================================================
Processgps:
Decr Gps_data_flag ' decriment for the line we are working on
Do ' look for start char "$" then continue.
Ch = Inkey() ' if not found in buffer then return.
If Ch = "" Then Return ' this will clear any bad chars.
Loop Until Ch = "$" ' once we see the '$' then continue.
Input Gpsline Noecho
Strlen = Len(gpsline)
Chksum = 0
Gps_chksum_b = 0
Strlen = Strlen - 3
For Index = 1 To Strlen
Chksum = Chksum Xor Strbytes(index)
Next Index
Gps_chksum = Right(gpsline , 2)
Gps_chksum_b = Hexval(gps_chksum)
If Chksum <> Gps_chksum_b Then
Print #2 , "{027}[16;1H" ; "Checksum error!" ; " " ; Gps_chksum ; "<>" ; Chksum ; "{027}[K"
Return
End If
Print #2 , "{027}[16;1H" ; " " ; "{027}[K"
Gps_head = Gettoken(gpsline , 44 , 1)
Select Case Gps_head
Case "GPGGA"
Print #2 , "{027}[17;1H" ; Gpsline ; "{027}[K"
Case "GPRMC"
Print #2 , "{027}[18;1H" ; Gpsline ; "{027}[K"
Gpstime_s = Gettoken(gpsline , 44 , 2)
Gpslon_s = Gettoken(gpsline , 44 , 4)
Gpslat_s = Gettoken(gpsline , 44 , 6)
We = Gettoken(gpsline , 44 , 7)
Ns = Gettoken(gpsline , 44 , 5)
Case "GPGSA"
Print #2 , "{027}[19;1H" ; Gpsline ; "{027}[K"
Case "GPVTG"
Print #2 , "{027}[20;1H" ; Gpsline ; "{027}[K"
Case "GPGSV"
Z_s = Gettoken(gpsline , 44 , 3)
Z = Val(z_s) + 20
Print #2 , "{027}[" ; Z ; ";1H" ; Gpsline ; "{027}[K"
Case Else
Print #2 , "{027}[24;1Helse :" ; Gpsline ; "{027}[K"
End Select
Return
Close #2
End
$include "color8x8.font"
$include "color16x16.font"
Jelenleg annyi történik, hogy az egyik soros porton van a gps modul a másikon soros porton meg kiírja az NMEA mondatokat, e mellett néhány adatot kiiratok a kijelzőre amiket az NMEA mondatból nyerek. Az eredeti az mcselec forumról való, megtoldottam még checksum ellenőrzéssel is, de így is van hogy hibás adat kerül a kijelzőre, és terminálba is látom hogy néha összeborulnak a sorok. Bár ezzel a gettoken asm-es cuccal eddig nagyon minimális hibát láttam. A fenti megoldás mellett próbáltam még főciklusba feldolgozni az adatokat de a jelenlegi jobban megfelel a későbbi céloknak, valamint úgy is voltak hibás adatok. Tehát tényleg nem lehet ezt a feladatot hiba nélkül megoldani vagy valamilyen teljesen más megközelítést kell alkalmazni?
Átlagos kimenet így néz ki:
Kód: Egész kijelölése
GPGGA,173240.000,4711.0000,N,01824.0000,E,1,6,1.39,116.7,M,41.2,M,,*5D
GPRMC,173239.000,A,4711.0000,N,01824.0000,E,0.37,140.24,210313,,,A*61
GPGSA,A,3,17,28,09,26,15,24,,,,,,,1.66,1.39,0.91*03
GPVTG,140.24,T,,M,0.37,N,0.69,K,A*35
GPGSV,4,1,14,24,68,306,12,15,48,201,15,09,47,106,40,17,47,072,35*77
GPGSV,4,2,14,12,37,247,16,37,35,175,,26,19,164,22,28,13,060,23*7A
GPGSV,4,3,14,18,12,277,,22,10,307,,25,05,246,,14,03,325,*76
Néha egy egy checksum error felvillan...