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

[ATMega][Bascom][Delphi] Funkcja CRC8

wicy 12 Lip 2009 15:43 1962 2
REKLAMA
  • #1 6769543
    wicy
    Poziom 22  
    Mam problem z kontrolą transmisji złożonej na układach radiowych i połączeniu z PC.
    Transmisja nadajnik->odbiornik wysyła paczki danych zakończonych crc8 (Bascom'owe CRC8). Dane przekazywane są potem do PC z taką samą paczką zakończoną crc8 (również Bascomowe CRC8).
    Po stronie PC odbieram dane ale mam problem z zaimplementowaniem w Delphi fumkcji crc8 z Bascoma.
    Podany w helpie przykład:
    
    Function Docrc8(ar() As Byte, bts As Byte) As Byte
    Dim J As Byte
    Dim k As Byte
    Dim crc8 As Byte
    crc8 = 0
    For m = 1 To bts
      x = ar(m)
      For k = 0 To 7
       J = 1 And (x Xor crc8)
       crc8 = Fix(crc8 / 2) And &HFF
       x = Fix(x / 2) And &HFF
       If J <> 0 Then
         crc8 = crc8 Xor &H8C
       End If
      Next k
    Next
    Docrc8 = crc8
    End Function
    

    przepisany do Delphi:
    
    Function TForm1.docrc8(ar:array of byte; bts:Byte):Byte;
    var
    J,k,crc8,m,x: Byte;
    begin
    crc8 := 0;
    For m:=0 To bts-1 do
    begin
      x:= ar[m];
      For k:=0 To 7 do
      begin
       J:=1 And (x Xor crc8);
       crc8:= round(crc8 / 2) And 255;
       x:= round(x / 2) And 255;
       If J <> 0 Then
       begin
         crc8:= crc8 Xor 140;
       End;
      end;
    end;
    Docrc8:= crc8
    End;
    

    Zwraca mi inne wartości crc, przez co prosta kontrola transmisji mi pada.

    Czy ktoś może podpowiedzieć, dlaczego obie funkcje liczą inne crc??
    I jak w Delphi obliczyć crc 7 bajtów by wynik był taki jak funkcji Bascomowej?
  • REKLAMA
  • Pomocny post
    #2 6770173
    H0miczek
    Poziom 20  
    wiesz, zdaje sie że Fix "odrzuca" część ułamkową a round zaokragla (matematycznie - w góre lub dół). to moze powodowac te błędy
  • #3 6770207
    wicy
    Poziom 22  
    Zauważyłem to. Zamiast Round należy zastosować Trunc.
REKLAMA