Checksum in nmea

wolfgang

Member
Licensed User
Longtime User
Hi,
maybe someone can use it:
B4X:
Sub Globals
   'dll: bitwise.dll, object: bit
   nmea = "$GPGGA,161649.417,4841.7903,N,01004.0221,E,2,05,2.0,578.3,M,48.0,M,1.0,0000*7D" 'example
   Dim checksum
   n = 1
End Sub

Sub App_Start
   Form1.Show
   bit.New1
   sign = StrAt(nmea,1)
   Do Until sign = "*"
      sign = Int(Asc(sign))
      checksum = bit.XOR(checksum,sign)
      n = n + 1
      sign = StrAt(nmea,n)
   Loop
   Msgbox("ASCII:  " & checksum & crlf & "HEX:    " & StrToUpper(bit.DecToHex(checksum)))
End Sub
 

Stulish

Active Member
Licensed User
Longtime User
B4A NMEA Checksum update

Hi wolfgang,

You inspired me to create the B4A version of the checksum

So i put together the subroutine below to calculate the checksum. i have worked with NMEA a lot with Visual Basic and found as the data was streaming the buffer might not hold a full sentence thus the code below checks the NMEA for a start position (stPos) which is 1 character after the $ sign and it also checks for the stop position (spPos), which is 1 character before the * sign. If there is not a complete sentence then the checksum is not returned just a null value.

Not sure if this will be any use to anyone :D

B4X:
Sub NMEA_Checksum(NMEA As String)
Dim stPos As Int, spPos As Int, a As Int, checksum As Int, charInt As Int,chk As String 
a=0
Do While a<NMEA.Length-1
   If NMEA.CharAt(a)="$" AND stPos=0 Then stPos=a+1
   If NMEA.CharAt(a)="*" AND spPos=0 Then spPos=a-1
   If stPos<>0 AND spPos<>0 Then a=NMEA.Length-2
   a=a+1
Loop
checksum=0 
If stPos<>0 AND spPos<>0 AND spPos>stPos Then 
   For a=stPos To spPos
      charInt = Asc(NMEA.CharAt(a))
      checksum = Bit.Xor(checksum,charInt)
   Next
    Msgbox("ASCII:  " & checksum & CRLF & "HEX:    " & Bit.ToHexString(checksum).ToUpperCase ,"CHECKSUM")
   Return Bit.ToHexString(checksum).ToUpperCase
Else
   Return Null
End If
End Sub
 
Last edited:
Top