Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi CRC-Prüfsumme erzeugen (https://www.delphipraxis.net/120510-crc-pruefsumme-erzeugen.html)

Elko 11. Sep 2008 21:28


CRC-Prüfsumme erzeugen
 
Hallo Leute! :hi:
Ich habe wieder einmal ein mehr oder weniger großes Problem: Ich lese Daten mit meinem Mikroprozessor ein und bekomme als letztes Byte eine CRC-Prüfsumme geschickt. In dem Datenblatt des Sendern (ist ein Temperatursensor; DS1822) steht als CRC-Polynom X^8+x^5+x^4+1.
Ich habe das als binäre Folge von 100110001 interpretiert, jedoch komme ich irgenwie gar nicht weiter und komme auf keine Lösung, wenn ich versuche, die Daten mit der CRC-PRüfsumme zu vergleichen.
Hier die Daten, die ich geschickt bekomme:

(MSB) DF00 0000 1FF8 E322 (LSB)

Dabei stellt das Byte "DF" die Prüfsumme dar, die aus den vorigen 56 Bit generiert wurde.
Kann mir jemand weiterhelfen? Wäre echt cool, denn ich finde auch per Google nix, was mir das plausibel erklären kann... :-( :glaskugel:

Viele Grüße,
Elko

Bernhard Geyer 11. Sep 2008 21:30

Re: CRC-Prüfsumme erzeugen
 
CRC

Elko 11. Sep 2008 21:35

Re: CRC-Prüfsumme erzeugen
 
Hm, wie gesagt, ich hab schon gegollgelt, aber auch der Artikel bei Wikipedia hilft mir nicht so wirklich weiter: Bei mir wird ja z.B. die CRC-Summe an den Anfang angehängt, müsste ich also von Anfang an die einzelnen Bits mit der Bitkombination 1 0011 0001 bitweise mit xor verknüpfen? :gruebel:

Gruß,
Elko

Bernhard Geyer 11. Sep 2008 21:41

Re: CRC-Prüfsumme erzeugen
 
Nee, die Berechnung mußt du beim 2ten Byte beginnen.

gammatester 12. Sep 2008 22:14

Re: CRC-Prüfsumme erzeugen
 
Das ist ein bekannter CRC-Algorithmus CRC-8/Dallas-1-Wire. Du mußt die Bytes mit den LSB zuerst eingegen. Also bei Dir werden die Bytes $22,$E3,$F8,$1F,$00,$00,$00 in dieser Reihenfolge verarbeiten. Hier ist das vollständige Beispiel mit meinen CRC-Model-Units:
Delphi-Quellcode:
{$ifdef win32}
{$apptype console}
{$endif}
uses
  mem_util,crcmodel,crcm_cat;
const
  test: array[0..6] of byte = ($22,$E3,$F8,$1F,$00,$00,$00);
var
  ctx: TCRC_ctx;
  crc: longint;
begin
  cm_Create(CRC8_DALLAS1W,nil,ctx);
  cm_Full(ctx, CRC, @test, sizeof(test));
  writeln(ctx.name,'(',HexStr(@test, sizeof(test)),')=$',HexByte(CRC));
end.
Ausgabe: CRC-8/Dallas-1-Wire(22e3f81f000000)=$df

Die Units gibts als Opensource-Freeware via http://home.netsurf.de/wolfgang.ehrh....html#crcmodel


Gruß Gammatester

Elko 12. Sep 2008 22:22

Re: CRC-Prüfsumme erzeugen
 
Hallo,
ich habe versucht, das per Hand mal durchzurechnen, aber da kommt bei mir nur Müll raus... leider... aber egal, ich habe das Problem -nach längerem Nachvollziehen der Hardware-Lösung- jetzt so gelöst:

Prinzip siehe hier.

Code:
unsigned char i, j, input, bit, crc, polynom, sernum[7];
crc=0;
polynom=0x131;

sernum[0]=0x22;
sernum[1]=0xE3;
sernum[2]=0xF8;
sernum[3]=0x1F;
sernum[4]=0x00;
sernum[5]=0x00;
sernum[6]=0x00;



for(i=0;i<7;i++){
    for(j=0;j<8;j++){
        input = (sernum[i]>>j) & (0x01);
        bit = (crc & 0x01)^input;
        crc ^= (bit<<4) | (bit<<3);
        crc >>= 1;
        crc |= bit<<7;
    }
}

printf("Die CRC-Pruefsumme lautet: %x", crc);
Da kommt dann auch anständig DF (nicht "Das Delphi-Forum") raus :spin: :thumb: :thumb: :thumb: :thumb: :thumb: Yippiiiie!

Oh, danke für den Beitrag eben, gammatester! Dann kann ich jetzt also auch mit den entsprechenden Units das ganze mit Delphi machen (habe es momentan in C für nen USB-Chip geschrieben) :cheers:


Viele Grüße,
Elko


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz