logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[BASCOM] Moduł GPS, zapis danych do tablicy. Po RS232.

misiek85_1 17 Paź 2009 22:20 2783 5
REKLAMA
  • #1 7141539
    misiek85_1
    Poziom 11  
    Witam.

    Uruchomiłem moduł GPS, poziomy napięć itp - wszytko ok. W komputerze widzę ramki itp..

    Teraz zastanawiam się w jaki (najprostszy i niezawodny) sposób odebrać od GPS'u dane, dotyczące: pozycja, prędkość, czas, wysokość, tryb pracy (2D, 3D). Znany mi jest opis ramek standardu NMEA.
    Jak na razie udało mi się "wyciągnąć" czas z ramki GGA...

    Chciałbym jednak, aby dane ramek zapisywane były do tablicy. Teraz pytanie: Mając daną jakąś ramkę ze standardu NMEA:
    
    $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
    

    w jaki sposób załadować do tablicy poszczególne wartości oddzielone przecinkiem?

    Nad czym myślałem:
    - myślałem nad zastosowaniem funkcji Mid(), lecz to odpada ze względu na to, że ramka danych nie jest "statyczna", tj. zmienia swoją długość
    - myślałem nad wykorzystaniem Inkey() - na takiej zasadzie, że gdy wykryje przecinek to zacznie zapisywać do nowej pozycji w tabeli - nie wiem czy to jest dobre rozwiązanie?
    - czy istnieje taka funkcja, która sama rozdzieli string tam gdzie wykryje przecinek i umieści w tablicy? W PHP jest taka fajna funkcja explode() się nazywa...

    Może macie jeszcze jakieś inne pomysły? Jak Wy to rozwiązaliście?
  • REKLAMA
  • #2 7141877
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 7141894
    PiotrEtenM500
    Poziom 19  
    zacznij od tego kodu

    
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Open "comd.3:4800,8,n,1" For Input As #2
    Open "comd.2:4800,8,n,1" For Output As #1
    
        Dim Poz As String * 32
        Dim Poz1 As String * 20
        Dim Poz2 As String * 20
        Dim Poz3 As String * 32
        Dim Pozv1 As String * 2
        Dim Pozv2 As String * 7
        Dim Pozv3 As String * 7
        Dim Pozv4 As String * 7
        Dim Pozh1 As String * 7
        Dim Pozh2 As String * 7
        Dim Pozh3 As String * 7
        Dim Pozh4 As String * 7
        Dim Pozppv As Single
        Dim Pozpph As Single
        Dim Li1 As Byte
        Dim A1 As String * 10
        Dim K3 As String * 120
        Dim K4 As String * 5
        Dim K5 As String * 15
        Dim H1 As String * 2                                    ' Godzina wyciagnieta z ramki $GPRMC
        Dim M1 As String * 2                                    ' Minuta  wyciagnieta z ramki $GPRMC
        Dim D1 As String * 2                                    ' data z $GPRMC
        Dim D2 As String * 2
        Dim D3 As String * 2
        Dim S1 As String * 1
        Dim K6 As Byte
    
    Pocz:
    Do
    '******************************************************************************
         Do
           K6 = Waitkey(#2)
         Loop Until K6 = 82
    '******************************************************************************
            Do
              K6 = Waitkey(#2)
              K3 = K3 + Chr(k6)
            Loop Until K6 = 13
    '******************************************************************************
    
         H1 = Mid(k3 , 4 , 2)
         M1 = Mid(k3 , 6 , 2)
    
         S1 = Mid(k3 , 15 , 1)
        
    '*******************************************************************************************
         If S1 = "V" Then                                       ' jeśli brak sygnału GPS
    
    
           Incr Li1
            If Li1 = 10 Then
             Li1 = 0
    
             Poz = "Koniec czasu"
    
             Goto Pocz:
            End If
    
             Print #1 , Poz
              Poz = "Brak Sygnalu GPS"
         End If
    
           If S1 = "A" Then
    
              D1 = Mid(k3 , 54 , 2)
              D2 = Mid(k3 , 56 , 2)
              D3 = Mid(k3 , 58 , 2)
    
              Pozv1 = Mid(k3 , 17 , 2)                          'odczyt pozycji pierwsz4e dwa bajty
              Pozv2 = Mid(k3 , 19 , 2)                          'pozycja V
              Pozv3 = Mid(k3 , 22 , 4)                          'pozycja V
              Poz = Pozv2 + Pozv3                               'pozycja V
              Pozppv = Val(poz)                                 'pozycja V
              Pozppv = Pozppv / 60                              'pozycja V
              Poz = Fusing(pozppv , "#.##")                     'pozycja V
              Poz1 = Mid(poz , 1 , 4)                           'pozycja V
              Poz2 = Mid(poz , 6 , 2)                           'pozycja V
              Poz = Poz1 + Poz2                                 'pozycja V
    
              Pozh1 = Mid(k3 , 30 , 2)                          'odczyt pozycji pierwsz4e dwa bajty
              Pozh2 = Mid(k3 , 32 , 2)                          'pozycja V
              Pozh3 = Mid(k3 , 35 , 4)                          'pozycja V
              Poz3 = Pozh2 + Pozh3                              'pozycja V
              Pozpph = Val(poz3)                                'pozycja V
              Pozpph = Pozpph / 60                              'pozycja V
              Poz3 = Fusing(pozpph , "#.##")                    'pozycja V
              Poz1 = Mid(poz3 , 1 , 4)                          'pozycja V
              Poz2 = Mid(poz3 , 6 , 2)                          'pozycja V
              Poz3 = Poz1 + Poz2                                'pozycja V
    
    
    
    
             Print #1 , "Godzina " ; H1 ; ":" ; M1 ; "   Data " ; D1 ; "/" ; D2 ; "/" ; D3 ; "   Pozycja " ; Pozv1 ; Chr(46) ; Poz ; "   " ; Pozh1 ; Chr(46) ; Poz3
         End If
         K3 = ""
    '******************************************************************************
    Loop
    
    
    
    End
    
    
  • REKLAMA
  • #4 7142988
    chrupex
    Poziom 11  
    ja bym na Twoim miejscu przerzucił się na c++, gdzie można to zrobić w paru linijkach kodu... Jakbyś sie zdecydował na zmianę języka to napisz, a prześle Ci jak ja to zrobiłem w c++
    Pozdrawiam!
  • REKLAMA
  • #5 7196061
    misiek85_1
    Poziom 11  
    Dziękuje za odpowiedzi :)
    Wracam do tematu. Próbuje zrozumieć ten program:
    1. Po co jest ten fragment, co on wykonuje, że K3 przyjmuje taką wartość:
    MC,214026.000,A,4807.3555,N,02850.2720,E,0.40,259.35,301009,,,A*65

    Wycinek programu zamieszczonego wyżej:
    Pocz:
    Do
    '******************************************************************************
         Do
           K6 = Waitkey()
         Loop Until K6 = 82
    '******************************************************************************
            Do
              K6 = Waitkey()
              K3 = K3 + Chr(k6)
            Loop Until K6 = 13
    '******************************************************************************
    
    Print K3
    

    Resztę rozumiem.

    Dziękuję, za pomoc
  • #6 7196131
    xury
    Specjalista automatyka domowa
    To jest odczyt z UARTu.
    W pierwszej pętli program czeka na pojawienie się litery "R"
    Potem w drugiej pętli zapisuje wszystkie odebrane znaki do zmiennej K3 aż do momentu pojawienia się znaku nowej linii CR (czyli chr(13)
REKLAMA