Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Format ramki ASCII przesyłanej po rs232

marysia 15 Sie 2011 10:30 1947 12
  • #1 15 Sie 2011 10:30
    marysia
    Poziom 10  

    Witam.
    Mam problem z rozpoznaniem algorytmu wyliczania sumy kontrolnej ramki ASCII przesyłanej po RS232. Poniżej przedstawiam prawidłowe ramki:

    01 30 30 02 30 39 03 09 0D // liczba kontrolna 09

    01 30 30 02 30 31 03 02 0D // liczba kontrolna 02



    01 30 30 02 30 30 30 30 31 30 30
    31 31 35 31 34 32 33 31 33 30 35
    31 31 35 33 30 30 30 30 03 02 0D // liczba kontrola 02

    Znalezione na forum i w internecie algorytmy nie sprawdziły się.
    Liczę na pomoc w rozwiązaniu mojego problemu.

    0 12
  • #2 15 Sie 2011 12:08
    tysky
    Poziom 12  

    Witam,

    Jakie algorytmy testowałaś ??

    0
  • #3 15 Sie 2011 13:54
    marysia
    Poziom 10  

    XOR,
    sumowanie bajtów i wynik jako u2,
    negowanie sumy,
    Suma kontrolna BCC,
    Suma kontrolna LRC,

    - Wszystkie dane przed sumą kontrolną
    - Wszystkie dane przed sumą kontrolną z wyjątkiem pierwszego znaku (z wyjątkiem STX)
    - Wszystkie dane przed sumą kontrolną z wyjątkiem ostatniego znaku (z wyjątkiem ETX)
    - Wszystkie dane przed sumą kontrolną z wyjątkiem pierwszego i ostatniego znaku (z wyjątkiem STX i ETX)

    0
  • #4 15 Sie 2011 15:04
    jestam
    Specjalista Automatyk

    marysia napisał:
    Mam problem z rozpoznaniem algorytmu wyliczania sumy kontrolnej ramki ASCII przesyłanej po RS232. Poniżej przedstawiam prawidłowe ramki:

    01 30 30 02 30 39 03 09 0D // liczba kontrolna 09


    Podaj wszystkie dostępne informacje o urządzeniu, które to generuje.
    Podaj też znacznie więcej ramek.

    0
  • #5 15 Sie 2011 16:57
    marysia
    Poziom 10  

    01 30 30 02 30 30 30 30 31 30 30 31 31 35 31 34 32 33 31 33 30 35 31 31 36 38 30 30 30 30 03 09 0D

    01 30 30 02 30 30 30 30 31 30 30 31 31 35 31 34 32 33 31 33 30 35 31 31 36 36 30 30 30 30 03 07 0D

    01 30 30 02 30 30 30 30 31 30 30 31 37 35 31 38 31 35 32 39 30 36 39 38 33 33 30 30 30 30 03 03 0D



    długie ramki odbierane są z czytnika kart rfid,
    krótkie wysyła aplikacja na pc czekając na kartę,

    ramki odczytane za pomocą monitora portu szeregowego.

    0
  • #6 16 Sie 2011 10:26
    wawcio
    Poziom 11  

    O ile to RFID na 125kHz - Sciagnij sobie sheeta standardu EM4102 (google), na 4 stronie masz ramkę, liczysz pion, poziom i parzystość dla każej kolumny.

    0
  • #7 16 Sie 2011 19:21
    marysia
    Poziom 10  

    Witam,

    Nie są to ramki z numerem UNIQUE, tylko dane przesyłane poprzez port szeregowy, praktycznie RFiD nie ma tu żadnego znaczenia, był wyłącznie wspomniany.

    Ponieważ jest to pracujące stare urządzenie jest problem z identyfikacją sposobu liczenia tzw. sumy kontrolnej , czyli bajtu do kontroli błędów. W powyższych ramkach suma ta jest 1 bajtowa i znajduje się na przed ostatniej pozycji (wytłuszczony druk) - zaraz przed 0x0D.

    01 30 30 02 30 30 30 30 31 30 30 31 31 35 31 34 32 33 31 33 30 35 31 31 36 38 30 30 30 30 03 09 0D

    Łatwo zauważyć, że w całej sekwencji zmieniają się wyłącznie dane od pozycji 12-26 oraz oczywiście nasza tzw. suma. (przykłady wyżej opisane)

    Pozostałe cyfry są takie same dla każdej ramki.

    0
  • #8 16 Sie 2011 23:40
    jestam
    Specjalista Automatyk

    Skoro jest tam program na PC, to najprościej użyć debuggera i przeanalizować kod generujący/sprawdzający sumę kontrolną.

    Alternatywa to analiza różnicowa - do tego potrzeba znacznie więcej próbek. Na razie wiadomo, że zmiana na poz. 26 może przenosić się wprost na sumę kontrolną (38->36) -> (09->07).

    0
  • #9 17 Sie 2011 09:20
    Paniola
    Poziom 2  

    W przypadku tych długich ramek sprawdza się sumowanie tego typu:

    01 30 30 02 30 30 30 30 31 30 30 31 31 35 31 34 32 33 31 33 30 35 31 31 36 38 30 30 30 30 03 09 0D

    1+5+1+4+2+3+1+3+5+1+1+6+8=41

    41/16=2 i reszta 9

    Podaj więcej przykładów, aby potwierdzić lub obalić tą zależność

    0
  • #10 17 Sie 2011 22:09
    marysia
    Poziom 10  

    Witam,

    Dziękuję za przyłączenie się do tematu i problemu.

    Niestety nie sprawdza się reguła mod16 na pozostałych ramkach. Jedna z ważnych rzeczy, to fakt, że nie można ominąć liczb od 12-26, gdyż są to dane z numerem.

    Jeżeli chodzi o debugowanie programu nie zawsze jest to możliwe, a druga sprawa przy megabajtach kodu, raczej pracochłonne. Być może będzie to ostateczność..

    Poniżej kilka innych ramek.

    01 30 30 02 30 30 30 30 31 30 30 31 31 35 31 34 32 33 31 33 30 35 31 31 35 33 30 30 30 30 03 02 0D

    01 30 30 02 30 30 30 30 31 30 30 31 31 35 31 34 32 33 31 33 30 35 31 31 35 34 30 30 30 30 03 06 0D

    01 30 30 02 30 30 30 30 31 30 30 31 31 35 31 34 32 33 31 33 30 35 31 31 35 35 30 30 30 30 03 07 0D

    01 30 30 02 30 30 30 30 31 30 30 31 31 35 31 34 32 33 31 33 30 35 31 31 35 36 30 30 30 30 03 05 0D


    01 30 30 02 30 30 30 30 31 30 30 31 31 35 31 34 32 33 31 33 30 35 31 31 36 32 30 30 30 30 03 03 0D

    01 30 30 02 30 30 30 30 31 30 30 31 31 35 31 34 32 33 31 33 30 35 31 31 36 30 30 30 30 30 03 02 0D

    Pozdrawiam,

    0
  • #11 18 Sie 2011 12:04
    jestam
    Specjalista Automatyk

    marysia napisał:
    01 30 30 02 30 30 30 30 31 30 30 31 31 35 31 34 32 33 31 33 30 35 31 31 35 33 30 30 30 30 03 02 0D

    01 30 30 02 30 30 30 30 31 30 30 31 31 35 31 34 32 33 31 33 30 35 31 31 35 34 30 30 30 30 03 06 0D

    01 30 30 02 30 30 30 30 31 30 30 31 31 35 31 34 32 33 31 33 30 35 31 31 35 35 30 30 30 30 03 07 0D

    01 30 30 02 30 30 30 30 31 30 30 31 31 35 31 34 32 33 31 33 30 35 31 31 35 36 30 30 30 30 03 05 0D


    Z powyższych ramek wynika, że obie hipotezy (moja, jak i kol. Paniola) są fałszywe;
    co więcej, te sumy kontrolne nie mogą być wynikiem żadnej kombinacji liniowej danych ramki postaci f(x) = a*x + b mod p.

    Dowód. Mamy: f(x) = 2, f(x+1) = 6, f(x+2) = 7, f(x +3) = 5.
    ax+b = 2 mod p
    ax+b + a = 6 mod p
    ax+b + 2a = 7 mod p

    Odejmując stronami a = 4 mod p i a = 1 mod p. koniec.

    Podobnie eliminujemy funkcje postaci f(x) = a*x^2 + bx + c mod p.

    Do dalszych analiz potrzebne są znacznie większe liczby ramek.

    marysia napisał:
    Jeżeli chodzi o debugowanie programu nie zawsze jest to możliwe, a druga sprawa przy megabajtach kodu, raczej pracochłonne. Być może będzie to ostateczność.

    Sztuka polega na analizie kilkuset właściwych bajtów kodu :) Jeśli to projekt komercyjny zapraszam na priv.

    0
  • #12 19 Sie 2011 17:55
    marysia
    Poziom 10  

    Witam,

    Temat sobie ostatecznie daruje, trochę za bardzo się to komplikuje.

    Dziękuje wszystkim za sugestie.

    Pozdrawiam,

    0
  • #13 19 Sie 2011 19:50
    bestler
    Admin DIY, Automatyka

    marysia napisał:
    Temat sobie ostatecznie daruje, trochę za bardzo się to komplikuje.


    ... a szkoda, bo ciekawy wątek.

    Zamykam.

    0
  Szukaj w 5mln produktów