Code:
Public Sub ReadGPS()
Static Ltry As Double 'Last Time we tried to reconnect GPS
Static Buff As String 'Buffer of Data
Dim NB As Long 'Number of Bytes
Dim b() As Byte 'Array of Bytes
Dim DT() As String 'GPS Fields
Dim sData As String 'Temp GPS Data
On Error Resume Next
'Prevention -- Issue posted by Arathranar
If Hibernated Then Exit Sub
'If MM running
If MMRunning Then
Buff = frmMM.MM.Custom("GetNMEA|GGA", "D3Request") + vbCrLf
Buff = Buff + frmMM.MM.Custom("GetNMEA|RMC", "D3Request") + vbCrLf
GoTo ProcGPSData
End If
'If nothing to do
If GPSPort = 0 Then Exit Sub
'Try to read bytes
NB = CommRead(GPSPort, b, 1024)
'If Got Data
If NB > 0 Then
Buff = Buff + StrConv(b, vbUnicode)
ProcGPSData:
NB = InStr(1, Buff, Chr(10), vbBinaryCompare)
'while there are complete lines
While NB > 0
'Get Line of Data
sData = Left(Buff, NB - 1)
'Adjust Buffer
Buff = Mid(Buff, NB + 1)
'Process Line of Data
If Left(sData, 1) = "$" Then
DT = Split(sData, ",")
Select Case DT(0)
Case "$GPRMC"
'Get Lat, Long, Speed and Heading
GPS.Lat = CDbl(Left(DT(3), InStr(1, DT(3), ".") - 1))
GPS.Lon = CDbl(Left(DT(5), InStr(1, DT(5), ".") - 1))
If CommaSys Then
'Prepare for Conversions
If CommaSys Then DT(3) = Replace(DT(3), ".", ",")
If CommaSys Then DT(5) = Replace(DT(5), ".", ",")
If CommaSys Then DT(7) = Replace(DT(7), ".", ",")
If CommaSys Then DT(8) = Replace(DT(8), ".", ",")
'Get Lat/Long
GPS.Lat = GPS.Lat \ 100# + (CDbl(Mid(DT(3), InStr(1, DT(3), ",") - 2)) / 60#)
GPS.Lon = GPS.Lon \ 100# + (CDbl(Mid(DT(5), InStr(1, DT(5), ",") + -2)) / 60#)
Else
GPS.Lat = GPS.Lat \ 100# + (CDbl(Mid(DT(3), InStr(1, DT(3), ".") - 2)) / 60#)
GPS.Lon = GPS.Lon \ 100# + (CDbl(Mid(DT(5), InStr(1, DT(5), ".") + -2)) / 60#)
End If
If DT(4) = "S" Then GPS.Lat = -GPS.Lat
If DT(6) = "W" Then GPS.Lon = -GPS.Lon
GPS.speed = CDbl(DT(7))
GPS.HDG = CInt(DT(8))
Case "$GPGGA"
'Get Altitude and Sat Count
If CommaSys Then DT(9) = Replace(DT(9), ".", ",")
GPS.Alt = CDbl(DT(9))
GPS.SATS = CInt(DT(7))
GPS.Valid = (Val(DT(6)) > 0)
End Select
End If
'Check for more lines
NB = InStr(1, Buff, Chr(10), vbBinaryCompare)
Wend
'Reset Timeout Timer
Ltry = Timer
Else
'Didn't get any data in 10 seconds (Problem ?)
'Try to reconnect GPS
If Timer - Ltry > 10 And MMRunning = False And CurSCR <> "destinator_gps.skin" Then
GPS.Valid = False
'Close Port
CommClose GPSPort
'Give O.S. processing time
Sleep 1
'Try to Re-open it
CommOpen GPSPort, "\\.\COM" + CStr(GPSPort), "baud=4800 parity=N data=8 stop=1"
CommSetLine GPSPort, 2, True 'Data Terminal Ready ON (in case)
Ltry = Timer
End If
If Ltry > Timer Then Ltry = Timer
End If
End Sub