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

[ATmega88][Bascom] Obliczanie Checksum dla NMEA

saycomp 11 Lut 2010 12:42 2943 9
REKLAMA
  • #1 7677652
    saycomp
    Poziom 12  
    Witam

    Jestem w tej materii bardzo początkującym.
    Chciałem poprosić o pomoc w napisaniu obliczania sumy kontrolnej dla protokołu NMEA. Dane, które chcę przesyłać wyglądają tak:

    Print "$SDDBT,,," ; wartosc ; ",M,,*" ; sum_kontrol

    gdzie "wartosc" to zmieniające się dane (long) a "sum_kontrol" to suma kontrolna. Suma kontrolna ma być obliczona dla ciągu:

    SDDBT,,,wartosc,M,,

    Szukałem długo w sieci jakichkolwiek podpowiedzi i praktycznycj przykładów ale na dobrą sprawę nic nie znalazłem...

    pozdrawiam serdecznie
  • REKLAMA
  • REKLAMA
  • REKLAMA
  • #4 7678316
    saycomp
    Poziom 12  
    Dzięki. Na dwóch z podanych przez Was stron byłem. MTK NMEA checksum calculator - cenny link, można sprawdzić czy program liczy poprawnie. Największym problemem jest dla mnie scalenie w jedno słowo dwóch ciągów znaków oraz liczby integer...

    pozdrawiam serdecznie
  • REKLAMA
  • Pomocny post
    #5 7680285
    leon1313
    Poziom 15  
    liczbę zamień na string: S1 = Str(i), a stringi dodaj.. S=S1+S2+S3
  • #6 7710764
    saycomp
    Poziom 12  
    Witam, przepraszam za dłuższe milczenie. Dziękuję za dotychczasową pomoc, właśnie chodziło o zamianę na stringi :-) Takie to proste, ale dopiero jak człowiek to zobaczy na własne oczy.
    Napisałem coś takiego:

    
    dim s1 as string * 8
    dim s2 as string * 4
    dim s3 as string * 4
    Dim Fx As long                    
    
    fx = 48
    
    s1 = "SDDBT,,,"
    s2 = str(Fx)
    s3 = ",M,,"
    
    s1 = s1 + s2
    s1 = s1 + s3
    
    Print "$SDDBT,,," ; Fx ; ",M,,*" ; checksum(s1)     ' na RS 232 wypisuje: $SDDBT,,,48,M,,*50       
    


    Program wylicza sumę kontrolną 50 a niestety dla tego ciągu wynosi ona 04...

    Nawet, gdy próbuję wyliczyć sume kontrolną dla jakiejkolwiek wartości (n.p. 48) to jest ona inna od tej, która jest wyliczana na stronie "MTK NMEA checksum calculator". Program (na PC), do którego mają zostać wprowadzone te dane także nie przyjmuje tej sumy kontrolnej. W pomocy Bascoma wyraźnie napisano, że polecenie "checksum" służy m.in. do obliczania sumy kontrolnej przy transmisji szeregowej...
    Macie jakiś pomysł o co chodzi i jak to ugryźć?

    pozdrawiam serdecznie
  • #7 7710942
    medicb
    Poziom 28  
    Nic innego jak XOR-owanie elementów.
  • Pomocny post
    #9 7711844
    leon1313
    Poziom 15  
    Zamieniasz poszczególne znaki na ich liczbowe odpowiedniki za pomocą funkcji: ASC i XORujesz z poprzednią wartością, za pomocą funkcji XOR. O rozbijaniu stringa na poszczególne znaki było parę( dziesiąt) postów temu.

    A sam XOR to inaczej suma modulo 2:
    0 xor 0 -> 0
    1 xor 0 -> 1
    0 xor 1- > 1
    1 xor 1 -> 0

    Oooo, znalazłem:
    https://www.elektroda.pl/rtvforum/topic1559351.html
    Chyba cos w tym klimacie będzie, XORowanie tobie zostawiam, na koniec wynik zamień na HEX
    
    Dim I As Byte
    Dim 1_znak As String * 1
    Dim Zmienna As String * 60
    For I = 1 To Len(zmienna)
       1_znak = Mid(zmienna , I , 1 )
    Next I
    
  • #10 7712447
    saycomp
    Poziom 12  
    Dzięki za ofiarną pomoc! Znalazłem też podpowiedź na forum MCS'a. Zmodyfikowałem ją i zrobiłem coś takiego (nareszcie działa!):

    
    s1 = "SDDBT,,,"
    s2 = str(fx)
    s3 = ",M,,"
    
    s1 = s1 + s2
    s1 = s1 + s3
    
    Dim Strbytes(20) As Byte
    Dim Gpsdata As String * 19 At Strbytes(1) Overlay
    Dim Strlen As Byte
    Dim Index As Byte
    Dim Chksum As Byte
    
       Gpsdata = s1
       Strlen = Len(gpsdata)
       Chksum = 0
    
       For Index = 1 To Strlen
          Chksum = Chksum Xor Strbytes(index)
       Next Index
    
    Print "$SDDBT,,," ; Fx ; ",M,,*" ; hex(chksum)              ' NMEA SDDBT
    
REKLAMA