CRC: Unterschied zwischen den Versionen

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche
K (→‎Links: cat)
Zeile 11: Zeile 11:
Beim CRC Verfahren gibt es ein sogenanntes Generator-Polynom, welches bei Sender und Empfänger der Daten (Sender und Empfänger können auch ein und das selbe Gerät sein) bekannt sein muss. Je nach Bezeichnung des Verfahrens handelt es sich um unterschiedliche Länge dieses Generator-Polynoms. Zum Beispiel bedeutet CRC16, dass das Generator-Polynom vom Grad 16 ist, sprich es hat 16 [[Bit]].
Beim CRC Verfahren gibt es ein sogenanntes Generator-Polynom, welches bei Sender und Empfänger der Daten (Sender und Empfänger können auch ein und das selbe Gerät sein) bekannt sein muss. Je nach Bezeichnung des Verfahrens handelt es sich um unterschiedliche Länge dieses Generator-Polynoms. Zum Beispiel bedeutet CRC16, dass das Generator-Polynom vom Grad 16 ist, sprich es hat 16 [[Bit]].


=== Anwendung ===
'''Zur praktischen Anwendung dieses Verfahrens:'''
'''Zur praktischen Anwendung dieses Verfahrens:'''


Zeile 19: Zeile 20:
Der Empfänger kann nun die erhaltenen Daten durch das Generator-Polynom teilen. Bleibt bei dieser Division 0 Rest sind die Daten korrekt übertragen worden. Ist der Rest ungleich 0, ist ein Fehler bei der Übertragung aufgetreten.
Der Empfänger kann nun die erhaltenen Daten durch das Generator-Polynom teilen. Bleibt bei dieser Division 0 Rest sind die Daten korrekt übertragen worden. Ist der Rest ungleich 0, ist ein Fehler bei der Übertragung aufgetreten.
Um die ursprünglichen Daten wieder zu erhalten (natürlich nur, falls sie korrekt übertragen wurden) müssen nur die letzten Stellen entfernt werden!
Um die ursprünglichen Daten wieder zu erhalten (natürlich nur, falls sie korrekt übertragen wurden) müssen nur die letzten Stellen entfernt werden!
=== Berechnungshinweise ===


'''Bei der Berechnung ist folgendes zu beachten:'''
'''Bei der Berechnung ist folgendes zu beachten:'''
Zeile 25: Zeile 28:
Hier beim CRC wird es aber mit einer [[Logische Verknüpfungen#XOR|XOR]] Verknüpfung realisiert. Desweiteren entfällt auch das bilden des Quotienten, dieser wird nicht benötigt.
Hier beim CRC wird es aber mit einer [[Logische Verknüpfungen#XOR|XOR]] Verknüpfung realisiert. Desweiteren entfällt auch das bilden des Quotienten, dieser wird nicht benötigt.


=== Beispiel ===
== Beispiel ==


http://www.mikrocontroller.net/forum/read-1-190635.html
http://www.mikrocontroller.net/forum/read-1-190635.html
Zeile 31: Zeile 34:
Das Generator-Polynom sei <math>x^5+x^2+x</math>. Dies entspricht der binären Zahl 100110. Das Polynom ist vom 5. Grad, weil das höchste gesetzte Bit den Wert 2^5 hat. Gerechnet wird aber immer nur mit den unteren 5 Bit, hier also 00110. Jetzt ist natürlich auch noch ein binäre Zeichenkette notwendig, die unsere Daten darstellt. Beispielsweise 1110100111001 (willkürlich gewählt).
Das Generator-Polynom sei <math>x^5+x^2+x</math>. Dies entspricht der binären Zahl 100110. Das Polynom ist vom 5. Grad, weil das höchste gesetzte Bit den Wert 2^5 hat. Gerechnet wird aber immer nur mit den unteren 5 Bit, hier also 00110. Jetzt ist natürlich auch noch ein binäre Zeichenkette notwendig, die unsere Daten darstellt. Beispielsweise 1110100111001 (willkürlich gewählt).


===='''Sender'''====
==='''Sender'''===


* An die Daten werden 5 Nullen angehängt:
* An die Daten werden 5 Nullen angehängt:
Zeile 59: Zeile 62:
     1 1 1 0 1 0 0 1 1 1 0 0 1 0 0 1 0 0
     1 1 1 0 1 0 0 1 1 1 0 0 1 0 0 1 0 0


===='''Empfänger'''====
==='''Empfänger'''===


'''ohne Fehler'''
'''ohne Fehler'''
Zeile 116: Zeile 119:
                           0 0 1 0 1 0 0
                           0 0 1 0 1 0 0
Somit bleibt also 10100 als Rest und dies bedeutet, dass die Daten nicht korrekt beim Empfänger angekommen sind!
Somit bleibt also 10100 als Rest und dies bedeutet, dass die Daten nicht korrekt beim Empfänger angekommen sind!
== Intere Links ==
* http://www.mikrocontroller.net/topic/219468
* http://www.mikrocontroller.net/topic/228553
* http://www.mikrocontroller.net/topic/12177


== Links ==
== Links ==

Version vom 20. Januar 2012, 12:26 Uhr

Cyclic Redundancy Check

Ein Verfahren um aus einem beliebig langen Datenstrom eine Prüfsumme (Schlüssel) fester Länge zu erzeugen. Das besondere ist, dass die Prüfsumme sich schon bei minimalen Veränderungen in den Daten total verändert und es sehr unwahrscheinlich ist, dass zwei verschiedene Datenströme die gleiche Prüfsumme haben.

Der häufigste Einsatzzweck von CRC ist die Überprüfung von Daten auf Unversehrtheit in einem Speicher oder nach einer Datenübertragung. CRC16 ist die häufigste Form. Es gibt jedoch auch weitere Verfahren, wie z. B. CRC8 oder CRC32.

Algorithmus

Der CRC Algorithmus ist relativ einfach zu bewerkstelligen und dennoch ein Mittel, um Daten bei ihrer Speicherung und/oder Übertragung wirkungsvoll auf Korrektheit zu prüfen!

Beim CRC Verfahren gibt es ein sogenanntes Generator-Polynom, welches bei Sender und Empfänger der Daten (Sender und Empfänger können auch ein und das selbe Gerät sein) bekannt sein muss. Je nach Bezeichnung des Verfahrens handelt es sich um unterschiedliche Länge dieses Generator-Polynoms. Zum Beispiel bedeutet CRC16, dass das Generator-Polynom vom Grad 16 ist, sprich es hat 16 Bit.

Anwendung

Zur praktischen Anwendung dieses Verfahrens:

  1. An die zu schützenden binären Daten werden N Bits mit dem Wert Null angefügt, wobei N die Anzahl Bits des Generatorpolynoms ist. (CRC16 -> 16 Bits)
  2. Die entstandene neuen binären Daten werden durch das Generator-Polynom geteilt und der Rest wird ermittelt!
  3. Der Rest wird zu den binären Daten hinzugefügt, er stellt die Prüfsumme dar.

Der Empfänger kann nun die erhaltenen Daten durch das Generator-Polynom teilen. Bleibt bei dieser Division 0 Rest sind die Daten korrekt übertragen worden. Ist der Rest ungleich 0, ist ein Fehler bei der Übertragung aufgetreten. Um die ursprünglichen Daten wieder zu erhalten (natürlich nur, falls sie korrekt übertragen wurden) müssen nur die letzten Stellen entfernt werden!

Berechnungshinweise

Bei der Berechnung ist folgendes zu beachten:

Das Bilden des Restes wird beim schriftlichen Divideren durch eine Subtraktion durchgeführt. Hier beim CRC wird es aber mit einer XOR Verknüpfung realisiert. Desweiteren entfällt auch das bilden des Quotienten, dieser wird nicht benötigt.

Beispiel

http://www.mikrocontroller.net/forum/read-1-190635.html

Das Generator-Polynom sei [math]\displaystyle{ x^5+x^2+x }[/math]. Dies entspricht der binären Zahl 100110. Das Polynom ist vom 5. Grad, weil das höchste gesetzte Bit den Wert 2^5 hat. Gerechnet wird aber immer nur mit den unteren 5 Bit, hier also 00110. Jetzt ist natürlich auch noch ein binäre Zeichenkette notwendig, die unsere Daten darstellt. Beispielsweise 1110100111001 (willkürlich gewählt).

Sender

  • An die Daten werden 5 Nullen angehängt:
    1 1 1 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0
  • Die Daten müssen jetzt durch das Generator-Polynom dividiert und somit der Rest ermittelt werden:
    1 1 1 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0
    1 0 0 1 1 0
    0 1 1 1 0 0 0
      1 0 0 1 1 0
      0 1 1 1 1 0 1
        1 0 0 1 1 0
        0 1 1 0 1 1 1
          1 0 0 1 1 0
          0 1 0 0 0 1 1 
            1 0 0 1 1 0
            0 0 0 1 0 1 0 0 1
                  1 0 0 1 1 0
                  0 0 1 1 1 1 0 0
                      1 0 0 1 1 0
                      0 1 1 0 1 0 0
                        1 0 0 1 1 0
                        0 1 0 0 1 0 0
                          1 0 0 1 1 0
                          0 0 0 0 1 0 0

Der Rest ist also 100.

  • Nun muss nur noch der Rest zu den Daten hinzugefügt werden:
    1 1 1 0 1 0 0 1 1 1 0 0 1 0 0 1 0 0

Empfänger

ohne Fehler

Der Empfänger ermittelt seinerseits jetzt natürlich ebenfalls aus diesen empfangenen Daten den Rest:

  • Rest ermitteln
    1 1 1 0 1 0 0 1 1 1 0 0 1 0 0 1 0 0
    1 0 0 1 1 0
    0 1 1 1 0 0 0
      1 0 0 1 1 0
      0 1 1 1 1 0 1
        1 0 0 1 1 0
        0 1 1 0 1 1 1
          1 0 0 1 1 0
          0 1 0 0 0 1 1 
            1 0 0 1 1 0
            0 0 0 1 0 1 0 0 1
                  1 0 0 1 1 0
                  0 0 1 1 1 1 0 0
                      1 0 0 1 1 0
                      0 1 1 0 1 0 1
                        1 0 0 1 1 0
                        0 1 0 0 1 1 0
                          1 0 0 1 1 0
                          0 0 0 0 0 0 0 

Der Rest ist also wirklich 0.

mit Fehler

Addieren wir beispielsweise 1100 zu den Daten hinzu bekommen wir also:

    1 1 1 0 1 0 0 1 1 1 0 0 1 0 0 1 0 0
                                1 1 0 0
    1 1 1 0 1 0 0 1 1 1 0 0 1 1 0 0 0 0

Jetzt führen wir die Division erneut durch und sehen uns den Rest an:

  • Rest ermitteln
    1 1 1 0 1 0 0 1 1 1 0 0 1 1 0 0 0 0
    1 0 0 1 1 0
    0 1 1 1 0 0 0
      1 0 0 1 1 0
      0 1 1 1 1 0 1
        1 0 0 1 1 0
        0 1 1 0 1 1 1
          1 0 0 1 1 0
          0 1 0 0 0 1 1 
            1 0 0 1 1 0
            0 0 0 1 0 1 0 0 1
                  1 0 0 1 1 0
                  0 0 1 1 1 1 1 0
                      1 0 0 1 1 0
                      0 1 1 0 0 0 0
                        1 0 0 1 1 0
                        0 1 0 1 1 0 0
                          1 0 0 1 1 0
                          0 0 1 0 1 0 0

Somit bleibt also 10100 als Rest und dies bedeutet, dass die Daten nicht korrekt beim Empfänger angekommen sind!

Intere Links

Links