Forum: Mikrocontroller und Digitale Elektronik CRC Implementierung


von LEON (Gast)


Lesenswert?

Guten Morgen,

von einem PC werden Daten via UDP an einen Mikrocontroller versendet.
Zusätzlich soll einen CRC Prüfung beim Empfänger eingebaut werden.
Wie müsste ich da vorgehen?

von Ingo L. (corrtexx)


Lesenswert?

LEON schrieb:
> Wie müsste ich da vorgehen?
CRC berechnen

von Purzel H. (hacky)


Lesenswert?

Naja. Den CRC an die Meldung anhaengen und pruefen. Wo liegt das Problem 
? Der CRC sollte Teil des Protokolle sein. Falls der CRC nicht stimmt, 
gibt der Empfaenger keine Antwort, das Packet ist verschwunden und wird 
nochmals gesendet.

eigentlich enthaelt eine UDP Meldung schon einen CRC... implizit im 
Ethernet frame

von LEON (Gast)


Lesenswert?

Beispiel:

Sender: TxBuffer[100]: Daten[96] + CRC[4]

Empfänger: RxPuffer[100]: Daten[96] + CRC[4]

von LEON (Gast)


Lesenswert?

Welche CRC Berechnung bzw. Polynom sollte man dafür einsetzen?

von MonetenHannes (Gast)


Lesenswert?

LEON schrieb:
> Welche CRC Berechnung bzw. Polynom sollte man dafür einsetzen?

Idealerweise hat der µC ein CRC Modul und dann schaut man, welche 
Polynome dies unterstützt.
Ansonsten hilft dir google zu CRC Polynomen und deren Fähigkeiten 
Bitfehler zu entdecken.

von blubb (Gast)


Lesenswert?

LEON schrieb:
> CRC[4]

Da Du wohl schon 32bit für die CRC  vorgeschlagen hast, probier doch mal 
die CRC32..

Da wir den verwendeten µC nicht kennen, können wir auch nicht empfehlen 
welcher Algorithmus besonders geeignet wäre..

von LEON (Gast)


Lesenswert?

XMC4700

von Falk B. (falk)


Lesenswert?

Siehe CRC.

von LEON (Gast)


Lesenswert?

Was soll das bringen wenn man die CRC auch mit sendet?

von Purzel H. (hacky)


Lesenswert?

Wichtig ist auf beiden Seiten denselben Code zu verwenden. Per Copy 
paste. Das Polynom alleine reicht leider nicht. Wir hatten schon zu 
viele Implementation, die nicht gepasst haben, weil die Annahme war - 
passt schon.

Ein CRC16 kann 2^16 bit = 8kByte schuetzen, ein CRC32, 2^32bit = 
256MByte. Ich wuerd's beim CRC16 belassen und den falls noetig als 
Tabelle implementieren falls die Zeit knapp ist. Sonst als Bitschieber.

von MonetenHannes (Gast)


Lesenswert?

LEON schrieb:
> Was soll das bringen wenn man die CRC auch mit sendet?

Lies dir erstmal das durch:

https://de.wikipedia.org/wiki/Zyklische_Redundanzpr%C3%BCfung


https://www.mikrocontroller.net/articles/CRC


Dann solltest du das wissen, warum es mitgeschickt wird.

von LEON (Gast)


Lesenswert?

Ok vielen Dank.

Wie läuft das beim Empfänger ab? Muss über die ankommenden Daten 
(Daten[96]) eine CRC gebildet werden? Was passiert mit den vier weiteren 
Bytes in denen die CRC vom Sender enthalten ist?

von Axel S. (a-za-z0-9)


Lesenswert?

LEON schrieb:
> Was soll das bringen wenn man die CRC auch mit sendet?

Wie soll der Empfänger denn sonst wissen, ob der von ihm berecnete CRC 
mit dem übereinstimmt, den der Sender berechnet hat?

<rolleyes>

von MonetenHannes (Gast)


Lesenswert?

LEON schrieb:
> Wie läuft das beim Empfänger ab? Muss über die ankommenden Daten
> (Daten[96]) eine CRC gebildet werden? Was passiert mit den vier weiteren
> Bytes in denen die CRC vom Sender enthalten ist?

Wie gesagt, beide Artikel lesen.

von LEON (Gast)


Lesenswert?

Es kann ja auch sein das beim Versenden die 4 Bytes für die CRC 
fehlerhaft sind.

von MonetenHannes (Gast)


Lesenswert?

LEON schrieb:
> Es kann ja auch sein das beim Versenden die 4 Bytes für die CRC
> fehlerhaft sind.

Ja sicher, das wird aber auch mit einer hohen Wahrscheinlichkeit 
detektiert.

von LEON (Gast)


Lesenswert?

Auch über die ankommende CRC soll dann eine CRC gebildet werden?

von nachtmix (Gast)


Lesenswert?

LEON schrieb:
> Es kann ja auch sein das beim Versenden die 4 Bytes für die CRC
> fehlerhaft sind.

Macht nichts.
Am Empfänger wird der CRC über die Nachricht einschliesslich des 
angehängten CRC gebildet. Dabei sollte 0 rauskommen.

von LEON (Gast)


Lesenswert?

Oder soll nur über die 96 Bytes (Daten) die CRC gebildet werden und mit 
der empfangenen CRC verglichen werden?

von LEON (Gast)


Lesenswert?

>>Am Empfänger wird der CRC über die Nachricht einschliesslich des
>>angehängten CRC gebildet. Dabei sollte 0 rauskommen.

Ok dann werde ich das ganze mal implementieren.

von HildeK (Gast)


Lesenswert?

LEON schrieb:
> Oder soll nur über die 96 Bytes (Daten) die CRC gebildet werden und mit
> der empfangenen CRC verglichen werden?

Natürlich! Was hätte es sonst für einen Sinn, CRC zu senden?
Am Besten so:

nachtmix schrieb:
> Am Empfänger wird der CRC über die Nachricht einschliesslich des
> angehängten CRC gebildet. Dabei sollte 0 rauskommen.

LEON schrieb:
> Es kann ja auch sein das beim Versenden die 4 Bytes für die CRC
> fehlerhaft sind.

Ja, das wäre dann halt insofern Pech, dass trotz eigentlich richtigem 
Datenempfang wiederholt werden muss - false positive. Dagegen kannst du 
dich letztlich nicht schützen und musst es auch nicht. Ein erfolgreiches 
Ergebnis sagt dir nur, dass mit sehr hoher Wahrscheinlichkeit kein 
Fehler erfolgt ist.
Denn theoretisch gäbe es auch den Fall, dass sowohl Daten als auch CRC 
so gefälscht werden, dass die CRC-Prüfung trotzdem noch passt. Diese 
Wahrscheinlichkeit lässt sich minimieren, wenn das Verhältnis der Längen 
von den Nutzdaten zu den CRC-Daten kleiner wird. Null wird sie trotzdem 
nicht, dafür die Wahrscheinlichkeit der false positiv größer.
Wie sagt man so schön: einen Tod musst du leiden ...

von MonetenHannes (Gast)


Lesenswert?

HildeK schrieb:
> Wie sagt man so schön: einen Tod musst du leiden ...

Z.B. den Tod die vorgeschlagenen Artikel zu lesen statt 13x zu fragen.

von Donni D. (Gast)


Lesenswert?

Wieso überhaupt CRC implementieren? Das sollte eigentlich im OSI Layer 2 
automatisch gemacht werden. Da wird ein Paket auch direkt verworfen, 
wenn die CRC nicht stimmt. Welchen Stack nutzt du denn? Oder haste was 
eigenes entwickelt?

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.