Android Question External GPS

Terradrones

Active Member
Licensed User
Hi All

I have a FOIF GPS Base and Rover. I have set up the Base over a known point and sent the known coordinates to the Base. The Channel, Radio Frequency, Correction Type, etc. are all the same on the Base and the Rover. I then send a command to start the Base and transmit corrections. The problem that I have is that the GGA NMEA string does not give me the Age, which means that the Rover is not getting corrections from the Base.

Here I switch to the Base, configure the base and start the Base:
B4X:
Sub SwitchToBase As ResumableSub
    CGlobals.BT.SendDataToDevice("SET,DEVICE.SYS_MODE.BASE" & CRLF)
    Sleep(250)
    
    CGlobals.BT.SendDataToDevice("UNLOGALL" & CRLF)
    Sleep(250)
    
    CGlobals.BT.SendDataToDevice("GETALL" & CRLF)
    Sleep(250)
    
    CGlobals.BT.SendDataToDevice("SET,DEVICE.CUR_LANGUAGE,ENGLISH" & CRLF)
    Sleep(250)
    
    Return 1
End Sub

Sub SetBasePosition As ResumableSub
    Dim tmpStr As String = Engine.Lon & "|" & Engine.Lat & "|" & CGlobals.GpsZ0
    
    CGlobals.BT.SendDataToDevice("SET,GPS.BASE.POSITION,REPEAT," & tmpStr)
    Sleep(250)
    
    Return 1
End Sub

Sub ConfigBase As ResumableSub
    ProgressDialogShow2("Configuring Base...", False)
    
    ' Base system configuration
    CGlobals.BT.SendDataToDevice("SET,DEVICE.SYS_MODE,BASE" & CRLF)
    Sleep(250)
    
    ' GPS settings
    CGlobals.BT.SendDataToDevice("SET,GPS.ELE_MASK," & CGlobals.DF(77) & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,GPS.BASE.SITE_ID," & CGlobals.DF(45) & CRLF)
    Sleep(250)
    
    ' Radio settings
    CGlobals.BT.SendDataToDevice("SET,RADIO.FREQUENCY," & CGlobals.BaseRQ & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,RADIO.CHANNEL," & CGlobals.BaseRC & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,RADIO.POWER," & CGlobals.BasePM & CRLF)
    Sleep(250)
    
    ' RTK settings
    CGlobals.BT.SendDataToDevice("SET,GPS.BASE.DIFF_TYPE," & CGlobals.BaseC & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,DEVICE.CUR_DATALINK" & CGlobals.BaseCT & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,DEVICE.RTK.RECORD_RAW,NO" & CRLF)
    Sleep(250)
    
    ' Device settings
    CGlobals.BT.SendDataToDevice("SET,DEVICE.CUR_LANGUAGE,ENGLISH" & CRLF)
    Sleep(250)
    
    ' Enable GNSS systems
    CGlobals.BT.SendDataToDevice("SET,GPS.GPS,ENABLE" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,GPS.BEIDOU,ENABLE" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,GPS.GLONASS,ENABLE" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,GPS.GALILEO,ENABLE" & CRLF)
    Sleep(250)
    
    ProgressDialogHide
    Return 1
End Sub

Next I do the same for the Rover:

B4X:
Sub ConfigRover As ResumableSub
    ProgressDialogShow2("Configuring Rover...",False)
    CGlobals.BT.SendDataToDevice ("SET,DEVICE.SYS_MODE,ROVER" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,DEVICE.RTK.MODE,ROVER" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice ("SET,GPS.ELE_MASK," & CGlobals.DF(77) & CRLF)                    'Elevation Mask
    Sleep(250)
    CGlobals.BT.SendDataToDevice ("SET,RADIO.FREQUENCY," & CGlobals.RoverRQ & CRLF)                'Frequency
    Sleep(250)
    CGlobals.BT.SendDataToDevice ("SET,RADIO.CHANNEL," & CGlobals.RoverRC & CRLF)                'Channel
    Sleep(250)
    CGlobals.BT.SendDataToDevice ("SET,RADIO.POWER," & CGlobals.RoverPM & CRLF)                    'Radio Power
    Sleep(250)
    CGlobals.BT.SendDataToDevice ("SET,GPS.BASE.DIFF_TYPE," & CGlobals.RoverC & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice ("SET,DEVICE.CUR_DATALINK" & CGlobals.RoverCT & CRLF)            'Data Link
    Sleep(250)
    CGlobals.BT.SendDataToDevice ("SET,DEVICE.RTK.RECORD_RAW,NO" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice ("SET,DEVICE.CUR_LANGUAGE,ENGLISH" & CRLF)
    Sleep(250)
    
    ' Enable GNSS systems
    CGlobals.BT.SendDataToDevice("SET,GPS.GPS,ENABLE" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,GPS.BEIDOU,ENABLE" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,GPS.GLONASS,ENABLE" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,GPS.GALILEO,ENABLE" & CRLF)
    Sleep(250)
    ProgressDialogHide
    
'    CGlobals.BT.SendDataToDevice("GET,DEVICE.RTK.STATUS" & CRLF)
'    Sleep(250)
'    CGlobals.BT.SendDataToDevice("GET,DEVICE.RTK.STATUS" & CRLF)
'    Sleep(250)
'       
'    Log(CGlobals.BT.ReadData)
    
    Return 1
End Sub

Sub SwitchToRover As ResumableSub
    CGlobals.BT.SendDataToDevice("UNLOGALL" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,DEVICE.CUR_LANGUAGE,ENGLISH" & CRLF)
    Sleep(250)
'    CGlobals.BT.SendDataToDevice("SET,DEVICE.STOPBASE" & CRLF)
'    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,GPS.BASE.AUTO_BASE,NO" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,DEVICE.RECORD.PDOP_THRESHOLD,99.0" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,GPS.BASE.PDOP_THRESHOLD,99.0" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,NETWORK.UPLOADGGA,0" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,NETWORK.RESET" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,DEVICE.SYS_MODE,ROVER" & CRLF)
    Sleep(250)
    Return 1
End Sub

Here I check if the Base is transmitting and it is:

B4X:
Sub MonitorBaseTransmission
'    CGlobals.BT.SendDataToDevice("UNLOGALL" & CRLF)
'    Sleep(250)
    
    ' Get Base Height
    CGlobals.BT.SendDataToDevice("GET,DEVICE.ANT_HEIGHT" & CRLF)
    Sleep(250)

    Dim BaseHgt As String = CGlobals.BT.ReadData

    If BaseHgt.Contains("DEVICE.ANT_HEIGHT") Then
        Dim Parts() As String = Regex.Split(",", BaseHgt)
    
        Try
            ' Find the part that contains "F" (feet marker)
            Dim heightPart As String = ""
            For Each part As String In Parts
                If part.Contains("F") Then
                    heightPart = part
                    Exit
                End If
            Next

            If heightPart <> "" Then
                ' Extract numeric value before "F"
                Dim value As String = heightPart.Substring2(0, heightPart.IndexOf("F"))
            
                ' Remove any trailing asterisk if present
                If value.Contains("*") Then
                    value = value.Substring2(0, value.IndexOf("*"))
                End If

                If IsNumber(value) Then
                    Label29.Text = NumberFormat2(value/1000, 1, 3, 3, False)
                Else
                    Log("Invalid height value: " & heightPart)
                End If
            Else
                Label29.Text = "0.000"
            End If
        Catch
            Label29.Text = "0.000"
        End Try
    End If
    
    ' For Foif A60, we can also check radio status
    CGlobals.BT.SendDataToDevice("GET,RADIO.STATUS" & CRLF)
    Sleep(250)
    Dim RadioStatus As String = CGlobals.BT.ReadData
    If RadioStatus.Contains("0300") Then
        Label32.Text="OK"
    Else If RadioStatus.Contains("0301") Then
        Label32.Text="Unsupported"
    Else If RadioStatus.Contains("0302") Then
        Label32.Text="Initialize Fail"
    Else If RadioStatus.Contains("0303") Then
        Label32.Text="Not Ready"
    Else If RadioStatus.Contains("0304") Then
        Label32.Text="Awaiting Command"
    Else If RadioStatus.Contains("0309") Then
        Label32.Text="Error Transmitting"
    Else If RadioStatus.Contains("0311") Then
        Label32.Text="Freq Out Of Range"
    End If
    
    'Get RTK Status
    CGlobals.BT.SendDataToDevice("GET,DEVICE.RTK.STATUS" & CRLF)
    Sleep(250)
    Dim RTKStatus As String = CGlobals.BT.ReadData
    If RTKStatus.Contains("0601") Then
        Label23.Text="Pending"
    Else If RTKStatus.Contains("0602") Then
        Label23.Text="Transmitting"
    Else If RTKStatus.Contains("0603") Then
        Label23.Text="Stopped"
        Engine.Lat=CGlobals.DF(47)
        Engine.Lon=CGlobals.DF(48)
        CGlobals.GpsZ0=CGlobals.DF(49)
        Select Case CGlobals.DF(31)
            Case 1
                'Leica
            Case 2
                'Emlid
'                    Wait For (Emlid.StartBase) Complete (i12 As Int)
            Case 3,4,5,10
                'Foif, Rinonav,E-Survey,StoneX
                Wait For (Foif.StartBase) Complete (i12 As Int)
                Sleep(250)
            Case 6
                'Tersus
            Case 7
                'Geomax
            Case 8
                'Comnav
            Case 9
                'CHC
        End Select
    End If

    'Link Status
    CGlobals.BT.SendDataToDevice("GET,DEVICE.CUR_DATALINK" & CRLF)
    Sleep(250)
    Dim LinkStatus As String = CGlobals.BT.ReadData
    If LinkStatus.Contains("NETWORK") Then
        Label26.Text="Network"
    Else If LinkStatus.Contains("UHF") Then
        Label26.Text="UHF"
    Else If LinkStatus.Contains("EXT") Then
        Label26.Text="External"
    Else If LinkStatus.Contains("BLUE") Then
        Label26.Text="Bluetooth"
    Else If LinkStatus.Contains("DUAL") Then
        Label26.Text="Dual"
    Else If LinkStatus.Contains("NO_DATALINK") Then
        Label26.Text="No Datalink"
    End If

    'Battery Status
    CGlobals.BT.SendDataToDevice("GET,DEVICE.POWER_LEVEL" & CRLF)
    Sleep(250)

    Dim BatteryStatus As String = CGlobals.BT.ReadData

    If BatteryStatus.Contains("DEVICE.POWER_LEVEL") Then
    Dim Parts() As String = Regex.Split(",", BatteryStatus)
    
    Try
        ' Get the value before the asterisk
        Dim BatteryPart As String = Parts(4)
        If BatteryPart.Contains("*") Then
            BatteryPart = BatteryPart.SubString2(0, BatteryPart.IndexOf("|"))
        End If
        
        If IsNumber(BatteryPart)=True Then
            Dim batteryValue As Int = BatteryPart
            If batteryValue >= 5 And batteryValue <= 100 Then
                Label28.Text = batteryValue & "%"
            End If
        End If
    Catch
        Label28.Text = "Error"
    End Try
    End If
    
    ' Get Expire date
    CGlobals.BT.SendDataToDevice("GET,DEVICE.EXPIRE_DATE" & CRLF)
    Sleep(150)

    Dim ExpDate As String = CGlobals.BT.ReadData

    If ExpDate.Contains("DEVICE.EXPIRE_DATE") Then
        Dim Parts() As String = Regex.Split(",", ExpDate)
    
        Try
            ' Find the part containing the date (8 digits)
            Dim DatePart As String = ""
            For i = 0 To Parts.Length - 1
                If Parts(i).Length >= 8 And IsNumber(Parts(i).SubString2(0, 8)) Then
                    DatePart = Parts(i).SubString2(0, 8)
                    Exit
                End If
            Next

            If DatePart.Length > 0 Then
                Dim Year As String = DatePart.SubString2(0, 4)
                Dim Month As String = DatePart.SubString2(4, 6)
                Dim Day As String = DatePart.SubString2(6, 8)
                If Year>2024 Then
                    Label35.Text = Day & "\" & Month & "\" & Year
                End If
            End If
        Catch
            Label35.Text = "Unknown"
        End Try
    End If

    'Get the Radio Frequency
    CGlobals.BT.SendDataToDevice("GET,RADIO.FREQUENCY" & CRLF)
    Sleep(250)

    Dim FreqStatus As String = CGlobals.BT.ReadData

    If FreqStatus.Contains("RADIO.FREQUENCY") Then
        Dim Parts() As String = Regex.Split(",", FreqStatus)
    
        Try
            ' Get the value before the asterisk
            Dim FreqPart As String = Parts(4)
            If FreqPart.Contains("*") Then
                FreqPart = FreqPart.SubString2(0, FreqPart.IndexOf("*"))
            End If
        
            If IsNumber(FreqPart) = True Then
                If FreqPart>439 And FreqPart<471 Then
                    Label37.Text = NumberFormat2(FreqPart, 1, 3, 3, False) '& " MHz"
                End If
            End If
        Catch
            Label37.Text = "Error"
        End Try
    End If

    'Get the Radio Channel
    CGlobals.BT.SendDataToDevice("GET,RADIO.CHANNEL" & CRLF)
    Sleep(250)

    Dim ChannelStatus As String = CGlobals.BT.ReadData

    If ChannelStatus.Contains("RADIO.CHANNEL") Then
        Dim Parts() As String = Regex.Split(",", ChannelStatus)
        Try
            'Find the part containing the channel number
            For i = 0 To Parts.Length - 1
                Dim part As String = Parts(i)
                If part.Contains("*") Then
                    part = part.SubString2(0, part.IndexOf("*"))
                End If
            
                If IsNumber(part) Then
                    Dim channelValue As Int = part
                    If channelValue >= 1 And channelValue <= 8 Then
                        Label39.Text = channelValue
                        Exit
                    End If
                End If
            Next
        Catch
            Label39.Text = "Error"
        End Try
    End If
    
    If Label23.Text = "Transmitting" And RadioStatus.Contains("OK") Then
        Label33.TextColor = Colors.Black
        Label33.Text = "Base Active And Transmitting"
    Else
        Label33.TextColor = Colors.Red
        Label33.Text = "Base Transmission Issue"
    End If
End Sub

Here I parse the NMEA Strings:

B4X:
Sub Class_Globals
    Dim Gps_String As String
    Dim I As Int
    Dim sText() As String
    Dim myfields() As String
    Dim got_an_error As Boolean
    Dim error_msg As String
    '
    '   GGA variables
    '
    Dim UTC_time As String
'    Dim latitude As Double
    Dim lat_type As String
'    Dim longitude As Double
    Dim long_type As String
'    Dim quality As String
'    Dim height_MSL As Double
    Dim geoidal_sepn As Double
    Dim height_units As String
'    Dim age As Int
    Dim ref_stn As String
    '
    '   GSA variables
    '
    Dim mode As String
    Dim current_mode As String
    Dim sat_prn(12) As Int
    Dim num_sat_prn As Int
'    Public pdop As Double
'    Dim hdop As Double
'    Dim vdop As Double
    '
    '   GST variables
    '
    Dim lat_error As Double
    Dim long_error As Double
    Dim horz_error As Double
    Dim height_error As Double
    '
    '    RMC variables
    '
    Dim rmc_status As String
    Dim speedOG As Double
    Dim trackMG As Double
    Dim rmc_date As String
    Dim magvar As Double
    Dim dirn_magvar As String
    Dim modeind As String
    
    Dim Geo As Geodesy
End Sub

'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize
    Geo.Initialize
End Sub

Sub CheckGPS(A As String)    ''(myval As Boolean)
    Dim I, sCount As Int
    
    Gps_String=A
    ''current_string = "None"
    sText = Regex.Split(CRLF, Gps_String)
    
    I=0
    sCount=Regex.Split(CRLF,Gps_String).Length
    For I=0 To sCount-1
        Try
            Select Case sText(I).SubString2(3,6)
                Case "GGA"
                    Parse_GGA
                Case "GSA"
                    Parse_GSA
                Case "GST"
                    Parse_GST
                Case "RMC"
            End Select
        Catch
            Log(LastException)
        End Try
    Next
End Sub

Sub Parse_GGA
    '
    '    parses a GGA string
    '
    Dim myval1, myval2 As Double
'    Dim mystr As String
    myfields = Regex.Split(",",sText(I))
    If(myfields.Length < 14) Then
        Return
    End If
    '
    '  check if we actually have data
    '
    CGlobals.Status = "No GPS"
    got_an_error = False
    error_msg="no error"
    '
    Try
        If myfields(2)="" Then Return
        UTC_time=myfields(1).SubString2(0,2) & ":" & myfields(1).SubString2(2,4) & ":" & myfields(1).SubString2(4,6)
        myval1=myfields(2).SubString2(0,2)
        myval2=myfields(2).SubString(2)
        myval2=myval2/60.0
        CGlobals.Lat=Round2(myval1+myval2,12)
        lat_type=myfields(3)
        
        myval1=myfields(4).SubString2(0,3)
        myval2=myfields(4).SubString(3)
        myval2=myval2/60.0
        CGlobals.Lon=Round2(myval1+myval2,12)
        long_type=myfields(5)
                        
        CGlobals.Status=""
        If(myfields(6)="0") Then
            CGlobals.Status="No GPS"
        End If
        If(myfields(6)="1") Then
            CGlobals.Status="GPS"
        End If
        If(myfields(6)="2") Then
            CGlobals.Status="DGPS"
        End If
        If(myfields(6)="4") Then
            CGlobals.Status="Fix"
        End If
        If(myfields(6)="5") Then
            CGlobals.Status="Float"
        End If
        '
        CGlobals.SatNo=myfields(7)
        If IsNumber(myfields(8))=True Then CGlobals.HDOP=myfields(8) Else CGlobals.HDOP=0
        CGlobals.LevHgt=myfields(9)
        height_units=myfields(10)
        geoidal_sepn=myfields(11)
        '
        If(myfields(13) <> "") Then
            CGlobals.Age=myfields(13)
        Else
            CGlobals.Age=0
        End If
        '
        ref_stn="??"
        If(myfields(14) <> "") Then
            If(myfields(14).substring2(0,4) = "0100") Then
                ref_stn = "VBS"
            End If
            If(myfields(14).substring2(0,4) = "1000") Then
                ref_stn = "HP"
            End If
            If(myfields(14).substring2(0,4) = "1008") Then
                ref_stn = "XP"
            End If
            If(myfields(14).substring2(0,4) = "1016") Then
                ref_stn = "HP & XP"
            End If
        End If
        CheckCoords
    Catch
        error_msg=LastException.Message
        '
    End Try
    '
End Sub

Sub Parse_GSA
    '
    '    parses a GSA string
    '
    Dim isat As Int
    myfields = Regex.Split(",",sText(I))
    If(myfields.length < 17) Then
        Return
    End If
    '
    Try
        '
        mode=myfields(1)
        If(mode="M") Then
            mode="Manual"
        Else
            mode="Automatic"
        End If
        If(myfields(2)="1") Then
            current_mode="No fix"
        Else If (myfields(2)="2") Then
            current_mode="2D fix"
        Else If (myfields(2)="3") Then
            current_mode="3D fix"
        End If
        '
        num_sat_prn=0
        For isat=1 To 12
            sat_prn(isat-1)=0
            If(myfields(isat+2)<>"") Then
                num_sat_prn=num_sat_prn+1
                
                sat_prn(isat-1)=myfields(isat+2)
            End If
        Next
        '
        CGlobals.Pdop=0.0
        CGlobals.Hdop=0.0
        CGlobals.Vdop=0.0
        '
        If(myfields(15)<>"") Then
            CGlobals.Pdop=myfields(15)
        End If
        If(myfields(16)<>"") Then
            CGlobals.Hdop=myfields(16)
        End If
        If(myfields(17)<>"") Then
            CGlobals.Vdop=myfields(17).SubString2(0,3)
        End If
    Catch
    End Try

End Sub

Sub Parse_GST
    Dim i1 As Int
    
    myfields = Regex.Split(",",sText(I))

    If(myfields.Length < 8) Then
        Return
    End If
    
    Try
        i1=myfields(8).IndexOf("*")
        
        myfields(8)=myfields(8).SubString2(0,i1)

        If (myfields(6) <> "") Then
            lat_error = myfields(6)
            lat_error=100.0*lat_error
            lat_error = Round2(lat_error,1)
        Else
            lat_error = 0
        End If
        CGlobals.LatError= myfields(6)
        
        If (myfields(7) <> "") Then
            long_error = myfields(7)
            long_error=100.0*long_error
            long_error = Round2(long_error,1)
        Else
            long_error = 0
        End If
        CGlobals.LonError= myfields(7)
        
        If (myfields(8) <> "") Then
            height_error = myfields(8)
            height_error=100.0*height_error
            height_error = Round2(height_error,1)
        Else
            height_error = 0
        End If
        CGlobals.HgtError= myfields(8)
        '
        '   calc horizontal error
        '
        horz_error = Sqrt((lat_error * lat_error) + (long_error * long_error))
        horz_error = Round2(horz_error, 1)
    Catch
    End Try
End Sub

Sub Parse_RMC
    '
    '    parses an RMC string
    '
    Dim myval1, myval2 As Double
'    Dim mystr As String
    myfields = Regex.Split(",",sText(I))
    If(myfields.Length < 12) Then
        Return
    End If
    '
    '  check if we actually have data
    '
    got_an_error = False
    error_msg="no error"
    '
    Try
        UTC_time=myfields(1).SubString2(0,2) & ":" & myfields(1).SubString2(2,4) & ":" & myfields(1).SubString2(4,6)
        '
'        status=myfields(2)
'        If(status="A") Then
'            status="Valid"
'        Else
'            status="Warning"
'        End If
        '
        myval1=myfields(3).SubString2(0,2)
        myval2=myfields(3).SubString(2)
        myval2=myval2/60.0
        CGlobals.Lat=Round2(myval1+myval2,7)
        lat_type=myfields(4)
        '
        myval1=myfields(5).SubString2(0,3)
        myval2=myfields(5).SubString(3)
        myval2=myval2/60.0
        CGlobals.Lon=Round2(myval1+myval2,7)
        long_type=myfields(6)
        '
        speedOG=myfields(7)
        trackMG=myfields(8)
'        date=myfields(9)
        magvar=myfields(10)
        dirn_magvar=myfields(11)
        If(myfields(12) = "A") Then
            modeind="Autonomous"
        Else If (myfields(12)="D") Then
            modeind="Differential"
        Else If (myfields(12)="N") Then
            modeind="Data not valid"
        End If
        '
    Catch
        error_msg=LastException.Message
        '
    End Try
    '
End Sub

Sub CheckCoords
'    If CGlobals.Li=2 And (CGlobals.DF(50)=3 Or CGlobals.DF(31)=3 Or CGlobals.DF(50)=2 Or CGlobals.DF(31)=2) And lat_type="S" Then
'        If CGlobals.lat>0 Then
'            CGlobals.lat=0-CGlobals.lat
'        End If
'    End If
    Select Case CGlobals.DF(50),CGlobals.DF(31)
        Case 1
            'Leica
        Case 2
            'Emlid
        Case 3,4,5,10
            'Foif, RinoNav, E-Survey, StoneX
            CGlobals.lat=0-CGlobals.lat
        Case 6
            'Tersus
'            Log(CGlobals.lat & "   " & CGlobals.Lon)
            CGlobals.lat=0-CGlobals.lat
'            CGlobals.lat=CGlobals.lat/1000
'            CGlobals.Lon=CGlobals.lon/1000
        Case 7
            'Geomax
        Case 8
            'ComNav
        Case 9
            'CHC
    End Select
    Geo.Get_point_to_Local(CGlobals.Lat ,CGlobals.Lon)
'    Log(Engine.Y & "  " & Engine.X & "   " & CGlobals.LevHgt)
    Select Case CGlobals.Code
        Case 20,70
            'Fix A Point, Calibrate NMEA
            CGlobals.Y3=CGlobals.Y3 + Engine.Y
            CGlobals.X3=CGlobals.X3 + Engine.X
            CGlobals.Z3 = CGlobals.Z3 + CGlobals.LevHgt - CGlobals.GPSPH
            CGlobals.Count=CGlobals.Count+1
        Case 1,2,3,4,10,21,22
            'Setout
            CGlobals.Y3=NumberFormat2(Engine.Y,1,3,3,False)
            CGlobals.X3=NumberFormat2(Engine.X,1,3,3,False)
            CGlobals.Z3 = CGlobals.LevHgt - CGlobals.GPSPH
            CGlobals.Z3 = NumberFormat2(CGlobals.Z3,1,3,3,False)
        Case 31,32,33,86,87
            'Topo
            CGlobals.Y3=NumberFormat2(Engine.Y,1,3,3,False)
            CGlobals.X3=NumberFormat2(Engine.X,1,3,3,False)
            CGlobals.Z3 = CGlobals.LevHgt - CGlobals.GPSPH
            CGlobals.Z3 = NumberFormat2(CGlobals.Z3,1,3,3,False)
        Case 40,41,42,43,50
            'Batterboards
            CGlobals.Y3=NumberFormat2(Engine.Y,1,3,3,False)
            CGlobals.X3=NumberFormat2(Engine.X,1,3,3,False)
            CGlobals.Z3 = CGlobals.LevHgt - CGlobals.GPSPH
            CGlobals.Z3 = NumberFormat2(CGlobals.Z3,1,3,3,False)
        Case 60,61,62,63,67,70,71,90,91,92,93,94,300
            'Elevations
            CGlobals.Y3=NumberFormat2(Engine.Y,1,3,3,False)
            CGlobals.X3=NumberFormat2(Engine.X,1,3,3,False)
            CGlobals.Z3 = CGlobals.LevHgt - CGlobals.GPSPH
            CGlobals.Z3 = NumberFormat2(CGlobals.Z3,1,3,3,False)
    End Select
    CGlobals.X3=CGlobals.X3 + CGlobals.XCorr
    CGlobals.Y3=CGlobals.Y3 + CGlobals.YCorr
    CGlobals.Z3=CGlobals.Z3 + CGlobals.ZCorr
End Sub

Everything seems to work fine except that I am not getting a "Fix" and the "Age" stays on "0".

Any push will be appreciated.

Thanks
Michael Papenhagen
 

amorosik

Expert
Licensed User
Can you send an example of a gga string read from the base?
Are you sure that the antenna + cable are OK?
Do you see the number of satellites received and the value for each satellite?
 
Upvote 0

Terradrones

Active Member
Licensed User
Hi Amorosik

I have put everything away. It's nearly 19h00 here in South Africa.

I will send those NMEA strings that I receive tomorrow.

Thanks for your reply, I appreciate it.
 
Upvote 0

amorosik

Expert
Licensed User
On GGA string there is a value, in sixth place, wich indicates the fix type
If the base does not fix, I do not think it can send the information to the rover for the position correction
 
Upvote 0

Terradrones

Active Member
Licensed User
Hi Amorosik

Here is my workflow:

When setting up the Base, I have 2 options where I can either select a Point from the coordinate Database or I can select the "Here"option.

The following is my code for the "Here" option:

B4X:
Sub Timer_Tick
    Select Case CGlobals.DF(50)
        Case 1
            'Leica
        Case 2
            'Emlid
            Emlid.ReadOncePos
        Case 3,4,5
            'Foif, RinoNav,E-Surevy
            Foif.ReadOncePos
        Case 6
            'Tersus
            Tersus.ReadOncePos
        Case 7
            'Geomax
        Case 8
            'Comnav
        Case 9
            'CHC
        Case 10
            'StoneX
    End Select
    If IsNumber(CGlobals.DF(76))=False Then CGlobals.DF(76)=0
    If IsNumber(CGlobals.DF(78))=False Then CGlobals.DF(78)=0
    If CGlobals.PDOP>CGlobals.DF(78) Or CGlobals.SatNo<CGlobals.DF(76) Then
        SatStatus1.TextColor=Colors.Red
    Else
        SatStatus1.TextColor=Colors.Black
    End If
    SatStatus1.Text="Sat: " & CGlobals.SatNo & " |Pd: " & NumberFormat2(CGlobals.PDOP,1,2,2,False) & " |dH: " & NumberFormat2(CGlobals.HDOP,1,2,2,False) & " |dV: " & NumberFormat2(CGlobals.VDOP,1,2,2,False) & " |" & CGlobals.Status
    If CGlobals.ReadFlag=1 Then
        CalcAverage
    End If
End Sub

Sub CalcAverage
    CGlobals.SatNo=NumberFormat2(CGlobals.SatNo,1,0,0,False)
    If CGlobals.SatNo < CGlobals.DF(76) Then
        SAT.TextColor = Colors.Red
    Else
        SAT.TextColor = Colors.Black
    End If
    If CGlobals.PDOP > CGlobals.DF(78) Then
        PDOP.TextColor = Colors.Red
    Else
        PDOP.TextColor = Colors.Black
    End If
    If CGlobals.Status="Float" Then
        SatStatus1.TextColor=Colors.Red
    Else
        SatStatus1.TextColor=Colors.Black
    End If
    If CGlobals.SatNo >= CGlobals.DF(76) And CGlobals.PDOP <= CGlobals.DF(78) And SatStatus1.TextColor=Colors.Black Then
        LogCount = LogCount + 1
        Label17.Text=LogCount
        RunPDOP = RunPDOP + CGlobals.PDOP
        RunSatNo = RunSatNo + CGlobals.SatNo
        RunSdy = RunSdy + CGlobals.LatError
        RunSdx = RunSdx + CGlobals.LonError
        RunSdz = RunSdz + CGlobals.HgtError
        RunVDOP = RunVDOP + CGlobals.VDOP
        RunHDOP = RunHDOP + CGlobals.HDOP
        RunY = RunY + CGlobals.Y3
        RunX = RunX + CGlobals.X3
        RunZ = RunZ + CGlobals.Z3
        RunLat = RunLat + CGlobals.Lat
        RunLong = RunLong + CGlobals.Lon
        RunEHeight = RunEHeight + CGlobals.LevHgt
        
        AvePDOP = RunPDOP / LogCount
        AveSatNo = RunSatNo / LogCount
        AveVDOP = RunVDOP / LogCount
        AveHDOP = RunHDOP / LogCount
        AveSdy = RunSdy / LogCount
        AveSdx = RunSdx / LogCount
        AveSdz = RunSdz / LogCount
        AveY = RunY / LogCount
        AveX = RunX / LogCount
        AveZ = (RunZ / LogCount)
        AveZ=AveZ-CGlobals.GpsIH
        AveLat = RunLat / LogCount
        AveLong = RunLong / LogCount
        AveEHeight = RunEHeight / LogCount
        AveEHeight=AveEHeight-CGlobals.GpsIH
        
        DEast.Text=NumberFormat2(AveSdy,1,3,3,False)
        DNorth.Text=NumberFormat2(AveSdx,1,3,3,False)
        DElev.Text=NumberFormat2(AveSdz,1,3,3,False)
'        East1.Text=NumberFormat2(AveY,1,3,3,False)
'        North1.Text=NumberFormat2(AveX,1,3,3,False)
'        Elev1.Text=NumberFormat2(AveZ,1,3,3,False)
        East2.Text=NumberFormat2(AveY,1,3,3,False)
        North2.Text=NumberFormat2(AveX,1,3,3,False)
        Elev2.Text=NumberFormat2(AveZ,1,3,3,False)
        
        PDOP.Text=NumberFormat2(AvePDOP,1,2,2,False)
        SAT.Text=NumberFormat2(AveSatNo,1,0,0,False)
        Status.Text=CGlobals.Status
    End If
End Sub

After a couple of minutes I stop the recording and I write the coordinates to the Base:

B4X:
Sub SetBasePosition As ResumableSub
    Dim tmpStr As String = Engine.Lon & "|" & Engine.Lat & "|" & CGlobals.GpsZ0
    
    CGlobals.BT.SendDataToDevice("SET,GPS.BASE.POSITION,REPEAT," & tmpStr)
    Sleep(250)
    
    Return 1
End Sub

Sub ConfigBase As ResumableSub
    ProgressDialogShow2("Configuring Base...", False)
    
    ' Base system configuration
    CGlobals.BT.SendDataToDevice("SET,DEVICE.SYS_MODE,BASE" & CRLF)
    Sleep(250)
    
    ' GPS settings
    CGlobals.BT.SendDataToDevice("SET,GPS.ELE_MASK," & CGlobals.DF(77) & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,GPS.BASE.SITE_ID," & CGlobals.DF(45) & CRLF)
    Sleep(250)
    
    ' Radio settings
    CGlobals.BT.SendDataToDevice("SET,RADIO.FREQUENCY," & CGlobals.BaseRQ & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,RADIO.CHANNEL," & CGlobals.BaseRC & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,RADIO.POWER," & CGlobals.BasePM & CRLF)
    Sleep(250)
    
    ' RTK settings
    CGlobals.BT.SendDataToDevice("SET,GPS.BASE.DIFF_TYPE," & CGlobals.BaseC & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,DEVICE.CUR_DATALINK" & CGlobals.BaseCT & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,DEVICE.RTK.RECORD_RAW,NO" & CRLF)
    Sleep(250)
    
    ' Device settings
    CGlobals.BT.SendDataToDevice("SET,DEVICE.CUR_LANGUAGE,ENGLISH" & CRLF)
    Sleep(250)
    
    ' Enable GNSS systems
    CGlobals.BT.SendDataToDevice("SET,GPS.GPS,ENABLE" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,GPS.BEIDOU,ENABLE" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,GPS.GLONASS,ENABLE" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,GPS.GALILEO,ENABLE" & CRLF)
    Sleep(250)
    
    ProgressDialogHide
    Return 1
End Sub

Now in theory, the Base should start transmitting corrections to the Rover.

Here I configure my Rover to make sure that the Base and Rover are on the same Radio Channel, Corrections, Frequency, etc.

B4X:
Sub ConfigRover As ResumableSub
    ProgressDialogShow2("Configuring Rover...",False)
    CGlobals.BT.SendDataToDevice ("SET,DEVICE.SYS_MODE,ROVER" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,DEVICE.RTK.MODE,ROVER" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice ("SET,GPS.ELE_MASK," & CGlobals.DF(77) & CRLF)                    'Elevation Mask
    Sleep(250)
    CGlobals.BT.SendDataToDevice ("SET,RADIO.FREQUENCY," & CGlobals.RoverRQ & CRLF)                'Frequency
    Sleep(250)
    CGlobals.BT.SendDataToDevice ("SET,RADIO.CHANNEL," & CGlobals.RoverRC & CRLF)                'Channel
    Sleep(250)
    CGlobals.BT.SendDataToDevice ("SET,RADIO.POWER," & CGlobals.RoverPM & CRLF)                    'Radio Power
    Sleep(250)
    CGlobals.BT.SendDataToDevice ("SET,GPS.BASE.DIFF_TYPE," & CGlobals.RoverC & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice ("SET,DEVICE.CUR_DATALINK" & CGlobals.RoverCT & CRLF)            'Data Link
    Sleep(250)
    CGlobals.BT.SendDataToDevice ("SET,DEVICE.RTK.RECORD_RAW,NO" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice ("SET,DEVICE.CUR_LANGUAGE,ENGLISH" & CRLF)
    Sleep(250)
    
    ' Enable GNSS systems
    CGlobals.BT.SendDataToDevice("SET,GPS.GPS,ENABLE" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,GPS.BEIDOU,ENABLE" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,GPS.GLONASS,ENABLE" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("SET,GPS.GALILEO,ENABLE" & CRLF)
    Sleep(250)
    ProgressDialogHide
    
'    CGlobals.BT.SendDataToDevice("GET,DEVICE.RTK.STATUS" & CRLF)
'    Sleep(250)
'    CGlobals.BT.SendDataToDevice("GET,DEVICE.RTK.STATUS" & CRLF)
'    Sleep(250)
'       
'    Log(CGlobals.BT.ReadData)
    
    Return 1
End Sub

Here I check if the Base is transmitting and it is transmitting, but the question is, what is the Base transmitting.

B4X:
Sub ConnectToBase
    If CGlobals.DF(35)<>""  Then
        'Connect to Base
        CGlobals.DeviceCon.Mac=CGlobals.DF(35)    'Mac Address
        CGlobals.DeviceCon.Name=CGlobals.DF(33)    'Name
    
        CGlobals.Mac=CGlobals.DeviceCon.Mac
        CGlobals.Name=CGlobals.DeviceCon.Name
        ProgressDialogShow2("Trying To Connect To Base..." & CRLF & CGlobals.DeviceCon.Name, True)
        CGlobals.BT.ConnectTo(CGlobals.DeviceCon)
        Wait For AfterConnect (Success As Boolean)
    Else
        CGlobals.BT.Disconnect
        CGlobals.GPSConnect=0
        ToastMessageShow("Base Not Paired" & CRLF & "Exiting Base Status",False)
        Timer2.Enabled=False
        HidePanels
        Panel0.Visible=True
    End If
End Sub

Sub Timer2_Tick
    MonitorBaseTransmission
End Sub

Sub MonitorBaseTransmission
'    CGlobals.BT.SendDataToDevice("UNLOGALL" & CRLF)
'    Sleep(250)
    
    ' Get Base Height
    CGlobals.BT.SendDataToDevice("GET,DEVICE.ANT_HEIGHT" & CRLF)
    Sleep(250)

    Dim BaseHgt As String = CGlobals.BT.ReadData

    If BaseHgt.Contains("DEVICE.ANT_HEIGHT") Then
        Dim Parts() As String = Regex.Split(",", BaseHgt)
    
        Try
            ' Find the part that contains "F" (feet marker)
            Dim heightPart As String = ""
            For Each part As String In Parts
                If part.Contains("F") Then
                    heightPart = part
                    Exit
                End If
            Next

            If heightPart <> "" Then
                ' Extract numeric value before "F"
                Dim value As String = heightPart.Substring2(0, heightPart.IndexOf("F"))
            
                ' Remove any trailing asterisk if present
                If value.Contains("*") Then
                    value = value.Substring2(0, value.IndexOf("*"))
                End If

                If IsNumber(value) Then
                    Label29.Text = NumberFormat2(value/1000, 1, 3, 3, False)
                Else
                    Log("Invalid height value: " & heightPart)
                End If
            Else
                Label29.Text = "0.000"
            End If
        Catch
            Label29.Text = "0.000"
        End Try
    End If
    
    ' For Foif A60, we can also check radio status
    CGlobals.BT.SendDataToDevice("GET,RADIO.STATUS" & CRLF)
    Sleep(250)
    Dim RadioStatus As String = CGlobals.BT.ReadData
    If RadioStatus.Contains("0300") Then
        Label32.Text="OK"
    Else If RadioStatus.Contains("0301") Then
        Label32.Text="Unsupported"
    Else If RadioStatus.Contains("0302") Then
        Label32.Text="Initialize Fail"
    Else If RadioStatus.Contains("0303") Then
        Label32.Text="Not Ready"
    Else If RadioStatus.Contains("0304") Then
        Label32.Text="Awaiting Command"
    Else If RadioStatus.Contains("0309") Then
        Label32.Text="Error Transmitting"
    Else If RadioStatus.Contains("0311") Then
        Label32.Text="Freq Out Of Range"
    End If
    
    'Get RTK Status
    CGlobals.BT.SendDataToDevice("GET,DEVICE.RTK.STATUS" & CRLF)
    Sleep(250)
    Dim RTKStatus As String = CGlobals.BT.ReadData
    If RTKStatus.Contains("0601") Then
        Label23.Text="Pending"
    Else If RTKStatus.Contains("0602") Then
        Label23.Text="Transmitting"                'Base is transmitting but what???
    Else If RTKStatus.Contains("0603") Then
        Label23.Text="Stopped"
        Engine.Lat=CGlobals.DF(47)
        Engine.Lon=CGlobals.DF(48)
        CGlobals.GpsZ0=CGlobals.DF(49)
        Select Case CGlobals.DF(31)
            Case 1
                'Leica
            Case 2
                'Emlid
'                    Wait For (Emlid.StartBase) Complete (i12 As Int)
            Case 3,4,5,10
                'Foif, Rinonav,E-Survey,StoneX
                Wait For (Foif.StartBase) Complete (i12 As Int)
                Sleep(250)
            Case 6
                'Tersus
            Case 7
                'Geomax
            Case 8
                'Comnav
            Case 9
                'CHC
        End Select
    End If

    'Link Status
    CGlobals.BT.SendDataToDevice("GET,DEVICE.CUR_DATALINK" & CRLF)
    Sleep(250)
    Dim LinkStatus As String = CGlobals.BT.ReadData
    If LinkStatus.Contains("NETWORK") Then
        Label26.Text="Network"
    Else If LinkStatus.Contains("UHF") Then
        Label26.Text="UHF"
    Else If LinkStatus.Contains("EXT") Then
        Label26.Text="External"
    Else If LinkStatus.Contains("BLUE") Then
        Label26.Text="Bluetooth"
    Else If LinkStatus.Contains("DUAL") Then
        Label26.Text="Dual"
    Else If LinkStatus.Contains("NO_DATALINK") Then
        Label26.Text="No Datalink"
    End If

    'Battery Status
    CGlobals.BT.SendDataToDevice("GET,DEVICE.POWER_LEVEL" & CRLF)
    Sleep(250)

    Dim BatteryStatus As String = CGlobals.BT.ReadData

    If BatteryStatus.Contains("DEVICE.POWER_LEVEL") Then
    Dim Parts() As String = Regex.Split(",", BatteryStatus)
    
    Try
        ' Get the value before the asterisk
        Dim BatteryPart As String = Parts(4)
        If BatteryPart.Contains("*") Then
            BatteryPart = BatteryPart.SubString2(0, BatteryPart.IndexOf("|"))
        End If
        
        If IsNumber(BatteryPart)=True Then
            Dim batteryValue As Int = BatteryPart
            If batteryValue >= 5 And batteryValue <= 100 Then
                Label28.Text = batteryValue & "%"
            End If
        End If
    Catch
        Label28.Text = "Error"
    End Try
    End If
    
    ' Get Expire date
    CGlobals.BT.SendDataToDevice("GET,DEVICE.EXPIRE_DATE" & CRLF)
    Sleep(150)

    Dim ExpDate As String = CGlobals.BT.ReadData

    If ExpDate.Contains("DEVICE.EXPIRE_DATE") Then
        Dim Parts() As String = Regex.Split(",", ExpDate)
    
        Try
            ' Find the part containing the date (8 digits)
            Dim DatePart As String = ""
            For i = 0 To Parts.Length - 1
                If Parts(i).Length >= 8 And IsNumber(Parts(i).SubString2(0, 8)) Then
                    DatePart = Parts(i).SubString2(0, 8)
                    Exit
                End If
            Next

            If DatePart.Length > 0 Then
                Dim Year As String = DatePart.SubString2(0, 4)
                Dim Month As String = DatePart.SubString2(4, 6)
                Dim Day As String = DatePart.SubString2(6, 8)
                If Year>2024 Then
                    Label35.Text = Day & "\" & Month & "\" & Year
                End If
            End If
        Catch
            Label35.Text = "Unknown"
        End Try
    End If

    'Get the Radio Frequency
    CGlobals.BT.SendDataToDevice("GET,RADIO.FREQUENCY" & CRLF)
    Sleep(250)

    Dim FreqStatus As String = CGlobals.BT.ReadData

    If FreqStatus.Contains("RADIO.FREQUENCY") Then
        Dim Parts() As String = Regex.Split(",", FreqStatus)
    
        Try
            ' Get the value before the asterisk
            Dim FreqPart As String = Parts(4)
            If FreqPart.Contains("*") Then
                FreqPart = FreqPart.SubString2(0, FreqPart.IndexOf("*"))
            End If
        
            If IsNumber(FreqPart) = True Then
                If FreqPart>439 And FreqPart<471 Then
                    Label37.Text = NumberFormat2(FreqPart, 1, 3, 3, False) '& " MHz"
                End If
            End If
        Catch
            Label37.Text = "Error"
        End Try
    End If

    'Get the Radio Channel
    CGlobals.BT.SendDataToDevice("GET,RADIO.CHANNEL" & CRLF)
    Sleep(250)

    Dim ChannelStatus As String = CGlobals.BT.ReadData

    If ChannelStatus.Contains("RADIO.CHANNEL") Then
        Dim Parts() As String = Regex.Split(",", ChannelStatus)
        Try
            'Find the part containing the channel number
            For i = 0 To Parts.Length - 1
                Dim part As String = Parts(i)
                If part.Contains("*") Then
                    part = part.SubString2(0, part.IndexOf("*"))
                End If
            
                If IsNumber(part) Then
                    Dim channelValue As Int = part
                    If channelValue >= 1 And channelValue <= 8 Then
                        Label39.Text = channelValue
                        Exit
                    End If
                End If
            Next
        Catch
            Label39.Text = "Error"
        End Try
    End If
    
    If Label23.Text = "Transmitting" And RadioStatus.Contains("OK") Then
        Label33.TextColor = Colors.Black
        Label33.Text = "Base Active And Transmitting"
    Else
        Label33.TextColor = Colors.Red
        Label33.Text = "Base Transmission Issue"
    End If
End Sub

Here I read what comes from the Rover, but the data is not corrected:

B4X:
Sub ReadPosition
    CGlobals.BT.SendDataToDevice("UNLOGALL" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("LOG,GGA,ONTIME,5HZ" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("LOG,VTG,ONTIME,5HZ" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("LOG,GST,ONTIME,5HZ" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("LOG,RMC,ONTIME,5HZ" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("LOG,GSA,ONTIME,1HZ" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("LOG,GEDOP,ONTIME,1HZ" & CRLF)
    Sleep(250)
    CGlobals.BT.SendDataToDevice("LOG,GEREF,ONTIME,1HZ" & CRLF)
    Sleep(250)
End Sub

Sub ReadOncePos()
    Dim A As String
    Dim I As Int
    Dim Buf As String
    
    A=""
    Buf=""
    For i=1 To 20
        A=CGlobals.BT.ReadData
        Sleep(250)
        Buf=Buf & A
    Next
    'Parse the String
    If Buf<>"" Then
        ReadNMEA.CheckGPS(Buf)
    End If
End Sub

Here is the GGA NMEA string that comes from the Rover:

$GPGGA,065216.60,3342.78696201,S,01857.71572184,E,1,20,0.8,161.1762,M,0.0000,M,,*4C

The "1" after the "E" should be "4" for a Fix. Also, after the second "M" should show me the Age.

Any push please?

Thanks
Michael Papenhagen
 
Upvote 0

amorosik

Expert
Licensed User
But the base gps, can it fix the position?
If you start the base gps in normal mode, and therefore 'not base' but rover mode, what does the fix type give you?
 
Upvote 0
Cookies are required to use this site. You must accept them to continue using the site. Learn more…