Forum: Mikrocontroller und Digitale Elektronik crc32 verständnisfrage


von crcler (Gast)


Lesenswert?

hallo,

ich habe einen Sender und Empfänger. der Sender überträgt ein array von 
bytes. die übertragung möchte ich mit einer CRC überprüfen. kann ich 
jetzt die CRC vom sender berechnen lassen und dem empfänger mitteilen 
und der berechnet ebenfalls die CRC und vergleicht die beiden? oder 
kommt da immer was unterschiedliches raus und der empfänger muss nur 
seine CRC ermitteln und durch das generatorpolynom teilen und wenn der 
Rest 0 ist ist die übertragung ok.

kann dazu jemand kurz was sagen?

danke

von Steven (. (ovular) Benutzerseite


Lesenswert?

CRC ist eher für den Empfänger gedacht. Er Prüft damit ob das was er 
bekommen hat valid ist.

Soweit ich das noch in Erinnerung habe, muss man ja (bei einem Byte) 
noch ein Paritätsbit mitsenden und ein zusätzliches Byte nach dem Ende 
des Arrays.
Somit kann ja der Empfänger ohne Kommunikation gleich Prüfen, ob was 
nicht stimmt...

Wenn also der Empfänger das CRC gemacht hat und einen Fehler erkannt 
hat, kann er den Datenblock nochmal anfordern.

Gruß
Steven

von crcler (Gast)


Lesenswert?

ok danke. also lass ich den empfänger das crc berechnen wenn alle bytes 
empfangen wurden und teile das durchs polynom und wenn nicht 0 raus 
kommt forder ich die daten neu an. danke

von crcler (Gast)


Lesenswert?

also das funktioniert soweit, aber ab einem bestimmten telegram erhalte 
ich immer den rest 1 obwohl alles gleich ist wie bei den anderen 
telegrammen, also außer der inhalt des telegrammes. aber die daten sind 
korrekt

von Steven (. (ovular) Benutzerseite


Lesenswert?

Hast Du das Paritätsbit für das Paritätsbyte mitgesendet?

von crcler (Gast)


Lesenswert?

ich denk doch mal. ich schick des über den serial1 Port eines visual 
basic programmes

von Der (Gast)


Lesenswert?

Die einfachste Variante ist folgende:
Der Sender berechnet die CRC über die Daten, versendet die Daten und die 
CRC. Der Empfänger empfängt die Daten und die CRC.
Der Empfänger berechnet auch die CRC über die Daten und vergleicht sie 
mit der empfangenen CRC.
Falls beide gleich sind:
Übertragung hat wunderbar funktioniert :-)
Falls sie nicht gleich sind: Bei der Übertragung gab es Fehler :-(

von Peter II (Gast)


Lesenswert?

Der schrieb:
> Der Empfänger empfängt die Daten und die CRC.
> Der Empfänger berechnet auch die CRC über die Daten und vergleicht sie
> mit der empfangenen CRC.

ich glaube der Trick ist, das der Emfpfänger über alles (Daten+CRC) die 
CRC berechnet und wenn man ende 0 rauskommt, dann stimmt alles. Es muss 
also nicht beide CRCs vergleichen.

von Steven (. (ovular) Benutzerseite


Lesenswert?

Also soweit ich das noch im Kopf habe wird einfach folgendes gemacht:

Für jedes Byte das gesendet wird wird die Anzahl der 1en in diesem Byte 
genommen und ermittelt ob diese Anzahl gerade oder ungerade ist. Ist sie 
gerade wird eine 1 zusätzlich übermittelt ansonsten eine 0.
Das passiert für jedes Byte. Das sind in der Regel Even-Bits

Ganz am Ende wird ein Byte gesendet welches Even-Bits enthalten, die für 
die 8 Spalten aller Bytes gedacht sind. Wenn ich mich nicht irre hat 
dieses letzte Byte dann aber kein 9. Evenbit. Oder doch? Muss man halt 
mal googlen.

Es reicht, wie Peter II schon schrieb, dass der Empfägner das CRC 
durchführt bzw. berechnet.

Gruß Steven

von Stefan E. (sternst)


Lesenswert?

Steven () schrieb:
> Für jedes Byte das gesendet wird wird die Anzahl der 1en in diesem Byte
> genommen und ermittelt ob diese Anzahl gerade oder ungerade ist. Ist sie
> gerade wird eine 1 zusätzlich übermittelt ansonsten eine 0.
> Das passiert für jedes Byte. Das sind in der Regel Even-Bits

Das sind Parität-Bits, und die haben rein gar nichts mit CRC zu tun. Das 
sind zwei komplett unterschiedliche Konzepte.

von Steven (. (ovular) Benutzerseite


Lesenswert?

Oh sorry, da hab ich was durcheiandergebracht.

CRC ist ja das mit den Polynomen...

Gruß Steven

von TommyZ (Gast)


Lesenswert?

Der Klassiker:

http://www.ross.net/crc/

TommyZ

von Der (Gast)


Lesenswert?

Peter II schrieb:
> Der schrieb:
>> Der Empfänger empfängt die Daten und die CRC.
>> Der Empfänger berechnet auch die CRC über die Daten und vergleicht sie
>> mit der empfangenen CRC.
>
> ich glaube der Trick ist, das der Emfpfänger über alles (Daten+CRC) die
> CRC berechnet und wenn man ende 0 rauskommt, dann stimmt alles. Es muss
> also nicht beide CRCs vergleichen.

Es geht beides.

von crcler (Gast)


Lesenswert?

ahhhhh ihr bringt mich noch mehr durcheinander.

also zuerst habe ich versucht von sender und empfänger die CRCs 
berechnen zu lassen und dann vergleichen. aber die bekommen irgendwie 
immer was unterschiedliches raus, obwohl das Polynom genau gleich ist. 
weis nicht woran das liegt.

von Crc (Gast)


Lesenswert?

Wikipedia kennt sich damit aus!

von holger (Gast)


Lesenswert?

>also zuerst habe ich versucht von sender und empfänger die CRCs
>berechnen zu lassen und dann vergleichen.

Dann zeig mal wie du das machst.

von Steven (. (ovular) Benutzerseite


Lesenswert?

crcler schrieb:
> ahhhhh ihr bringt mich noch mehr durcheinander.

Sorry meine Schuld...

von Stefan W. (dl6dx)


Lesenswert?

crcler schrieb:
> aber die bekommen irgendwie
> immer was unterschiedliches raus, obwohl das Polynom genau gleich ist.
> weis nicht woran das liegt.

Um welches CRC-Verfahren handelt es sich denn?

Es geht nicht nur um das Generatorpolynom, der Startwert des Registers 
und die Reihenfolge der Übermittlung durch den Sender ist ebenfalls 
wichtig.

Am Beispiel des CCITT-CRC (Link-Layer von X.25):

Sender: Der Initialwert ist 0xFFFF. Der CRC wird über über alle Bytes 
der Nachricht berechnet, das Ergebnis wird invertiert (Einerkomplement!) 
und in der Reihenfolge low byte, high byte übertragen.

Der Empfänger initialisiert ebenfalls mit 0xFFFF, berechnet den CRC über 
alle empfangenen Zeichen einschließlich der beiden übertragenen 
CRC-Bytes, das Ergebnis der Berechnung muss 0xF0B8 sein.

Andere Verfahren verwenden andere Startwerte, ebenfalls gibt es 
unterschiedliche Vorgaben für die Bitreihenfolge bei der Übertragung.

Du musst es so machen, wie es das von dir verwendete Verfahren vorgibt! 
Alles andere führt zu nichts.

Welches Verfahren ist es denn nun?

Grüße

Stefan

von crcler (Gast)


Lesenswert?

Stefan Wagner schrieb:
> Welches Verfahren ist es denn nun?

Das weis ich nicht so genau. also wenn ich bei dem Mikrocontroller im 
debugger schaue, dann seh ich das wenn ich das CRC Register Resete das 
es dann den Wert 0xFFFF FFFF hat. also nehme ich den Startwert 0xFFFF 
FFFF an. in dem Datenblatt des Controllers steht nur das das 
Generatorpolynom 0x4C11DB7 wie bei Ethernet. Darunter steht dann noch 
folgendes:
– X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2+ 
X +1

und es ist natürlich ein CRC 32 bit

von Stefan W. (dl6dx)


Lesenswert?

crcler schrieb:
> in dem Datenblatt des Controllers steht nur das das
> Generatorpolynom

Jetzt kommen wir der Sache näher.

a) Welcher Controller ist das?
b) Muss sich deine Anwendung an Vorgaben halten? Oder legst du das 
Verfahren fest?

Grüße

Stefan

PS: Diese Informationen, ganz zu Anfang gegeben, hätten viel Raterei 
erspart.

von crcler (Gast)


Lesenswert?

Stefan Wagner schrieb:
> a) Welcher Controller ist das?
> b) Muss sich deine Anwendung an Vorgaben halten? Oder legst du das
> Verfahren fest?


ja sry.

zu a)
also es ist ein stm32f10x und ich möchte eben die Kommunikation zwischen 
dem Controller und dem PC über eine CRC 32 absichern. der Controller 
besitzt ein internes Modul welche eine CRC berechnen und auf die gleiche 
weise muss ich am PC nun auch die CRC berechnen, damit ich es 
vergleichen kann. und wie der Controller das genau macht weis ich nicht.

zu b)
wie meinst du das mit Vorgaben? ich möchte halt am ende ein array von 
bytes übertragen und zum schluss die CRC

von Stefan W. (dl6dx)


Lesenswert?

crcler schrieb:
> ich möchte eben die Kommunikation zwischen dem Controller und dem PC
> über eine CRC 32 absichern.
> ich möchte halt ein array von bytes übertragen
> es ist ein stm32f10x

Warum muss man denn alles erst mühsam erfragen?

Dann bist du im Verfahren nicht festgelegt und kannst nehmen, was du 
möchtest.

Erste Empfehlung: Nimm ein eingeführtes Verfahren, dann tappst du nicht 
in Designfallen.

Zweite Empfehlung: Such das Verfahren nach den Anforderungen deiner 
Übertragung aus, nicht nach dem, was zufällig im Controller eingebaut 
ist.

Deswegen:
- Wie groß ist ein Datentelegramm?
- Wie störanfällig ist die Stecke? (Bzw.: Worüber überträgst du?)

Danach solltest du das verwendete CRC-Verfahren aussuchen. Falls du 
überhaupt eins brauchst.

Solltest du nur über USB auf einen virtuellen COM-Port gehen wollen, 
brauchst du eigentlich keinen CRC. (USB hat bereits eine Sicherung über 
CRC.)

Falls du aber trotzdem einen CRC implementieren willst, würde ich dir 
fast raten wollen, die CRC-Unit zu vergessen und es auf beiden Seiten 
rein in Software zu machen. Codebeispiele gibt es genug und 
Rechenleistung dürftest du auf beiden Seiten mehr als ausreichend haben.

Du kannst natürlich auch die eingebaute CRC-Unit verwenden. Dann musst 
du aber das Datenblatt und das Reference Manual sehr genau lesen, um die 
CRC-Unit passend zu konfigurieren.

Grüße

Stefan

PS: Einzige Ausnahme: Du musst die Daten in einem derartigen Tempo 
"raushauen", dass das Berechnen "zu Fuß" nicht mehr möglich ist. Nach 
deiner Beschreibung scheint das aber nicht der Fall zu sein.

von crcler (Gast)


Lesenswert?

vielen dank für die antwort.

die crc möchte ich verwenden da es sehr wichtig ist das die bytes 
korrekt übertragen werden. die telegramlänge ist bis zu 255 bytest. die 
kommunikation kann über verschiedene wege stattfinden, z.b. usb, rs485, 
rs232, ethernet,... desweiteren kann die störbeeinflussung der umgebung 
sich verändern.

von Stefan W. (dl6dx)


Lesenswert?

Ok,

da kannst du vom CRC-16 über den CCITT-CRC bis zum CRC-32 eigentlich 
alles verwenden.

Du kennst http://www.mikrocontroller.net/articles/CRC und 
http://www.mikrocontroller.net/forum/codesammlung?filter=crc* ?

Da du ursprünglich einen 32er haben wolltest, ist wohl das hier was für 
dich: Beitrag "Yet another CRC32 Code"

Grüße

Stefan

von crcler (Gast)


Lesenswert?

Stefan Wagner schrieb:
> Ok,
>
> da kannst du vom CRC-16 über den CCITT-CRC bis zum CRC-32 eigentlich
> alles verwenden.
>
> Du kennst http://www.mikrocontroller.net/articles/CRC und
> http://www.mikrocontroller.net/forum/codesammlung?... ?
>
> Da du ursprünglich einen 32er haben wolltest, ist wohl das hier was für
> dich: Beitrag "Yet another CRC32 Code"
>
> Grüße
>
> Stefan


danke Stefan für deine Große mithilfe.
ich hab jetzt mal im Mikrocontroller eine eigene CRC berechnung erstellt 
und mit dieser klappt alles. DANKE

Dennoch würde mich gerne interesieren was die interne CRC berechnung des 
stm32 anderst macht.

von Stefan W. (dl6dx)


Lesenswert?

crcler schrieb:
> Dennoch würde mich gerne interesieren was die interne CRC berechnung des
> stm32 anderst macht.

Das müsstest du alles im Reference Manual finden können. Das Kapitel 
über den CRC-Generator ist recht umfangreich.

Richte dich aber auf ein paar Stunden konzentrierter Lektüre ein...

Grüße

Stefan

von crcler (Gast)


Lesenswert?

Stefan Wagner schrieb:
> Das müsstest du alles im Reference Manual finden können. Das Kapitel
> über den CRC-Generator ist recht umfangreich.
>
> Richte dich aber auf ein paar Stunden konzentrierter Lektüre ein...

umfangreich? da sind doch nur 3 Seiten. Seite 62-64

von crcler (Gast)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.