Your VB program is calculating the checksum using every single
ASCII digit. If you want to do this with your PIC, then you'll need
to work with single ASCII digits also. At least when calculating the
checksum.
Code:
X VAR BYTE
SUM VAR byte
Dec_lat1 VAR BYTE
Dec_lat2 VAR BYTE
C VAR BYTE [35]
' Load array string with "$GPWPL,119.98,W,47.3456,N,TOMHOME,*"
' Note: Dec_Lat1 & Dec_Lat2 ASCII values are computed in Num_To_ASCII
' sub-routine. This converts individual DIGits from each byte into ASCII.
' Array elements to be converted to ASCII are marked with an x.
C[0]="$" :C[1]="G" :C[2]="P" :C[3]="W" :C[4]="P" :C[5]="L"
C[6]="," :C[7]="x" :C[8]="x" :C[9]="x" :C[10]="." :C[11]="x"
C[12]="x" :C[13]="," :C[14]="W" :C[15]="," :C[16]="4" :C[17]="7"
C[18]="." :C[19]="3" :C[20]="4" :C[21]="5" :C[22]="6" :C[23]=","
C[24]="N" :C[25]="," :C[26]="T" :C[27]="O" :C[28]="M" :C[29]="H"
C[30]="O" :C[31]="M" :C[32]="E" :C[33]="," :C[34]="*"
MAIN:
SUM = 0 ' Clear SUM on entry
GOSUB Num_To_ASCII ' Convert Lat1 & Lat2 to ASCII for calculation
GOSUB CheckSum ' Calculate checksum of array
HSEROUT [STR C\35,HEX SUM,13,10] ' Now show retult
PAUSE 2000
GOTO Main
CheckSum:
' 33 bytes from "G" to "," chopping off "$" & "*"
FOR X = 1 TO 33
SUM = (SUM ^ C[X])
NEXT X
RETURN
Num_To_ASCII:
Dec_lat1 = 119
C[7] = Dec_lat1 DIG 2+"0" ' element c[7] = ASCII 1
C[8] = Dec_lat1 DIG 1+"0" ' element c[8] = ASCII 1
C[9] = Dec_lat1 DIG 0+"0" ' element c[9] = ASCII 9
Dec_lat2 = 98
C[11] = Dec_lat2 DIG 0+"0"
C[12] = Dec_lat2 DIG 1+"0"
RETURN
END
This returns the same checksum values as your VB program.
Just modify the Num_To_ASCII routine to work on whatever byte
(or word) variables you have your longitude/latitude data in. Convert
each digit to ASCII, and stuff them into the appropriate array element
spaces.
The output captured in a terminal program from the above is
$GPWPL,119.89,W,47.3456,N,TOMHOME,*23
A slightly modified version of your VB program outputs the same.
Code:
Private Sub Command1_Click()
Dim sText As String
Dim NMEAChecksum As String
Dim i&, sum&
sText = "$GPWPL,119.98,W,47.3456,N,TOMHOME,*"
For i = 2 To Len(sText) - 1
sum = sum Xor Asc(Mid$(sText, i, 1))
Next i
NMEAChecksum = Right$("0" & Hex$(sum), 2)
Debug.Print sText & NMEAChecksum
End Sub
Bookmarks