www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik geeigneter Algorithmus fuer Pruefsumme


Autor: Paule (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hei Leute,

ich will 15 Char-Bytes ueber die serielle Schnittstelle meines uC 
senden. Diesen 15 Bytes will ich ein 1-3 Byte langes Kontrollzeichen 
anhaengen. Habt ihr einen Vorschlag wie ich das am Besten machen 
koennte(CRC etc., vielleicht hat jemand ja einen passenden Alg. auf 
Lager) und habt ihr vor allem ein C-CODEBEISPIEL dafuer???
Vielen Dank.

Gruss Paule

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.mikrocontroller.net/articles/CRC und der dort erwähnte Links 
ins Forum...

Autor: Bertrik Sikken (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Have a look at the Fletcher's checksum:
http://en.wikipedia.org/wiki/Fletcher%27s_checksum

It's much simpler (and probably faster and less code too) to calculate 
than a real CRC and works almost as good.

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Programmierst du in C? Evtl. mit WinAVR? Da gibt's ne super Lib für CRC 
(8 und 16). Hab' ich auch benutzt, funktioniert prima!

Autor: Paule (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke fuer die Antworten Jungs,

also so wie ich das verstanden hab benutzt man hauptsächlich CRC zur 
Prüfung.
Verstehe ich das dann richtig: wenn ich also 15Bytes CRC'en will und ich 
z.B. einen 16bit CRC-Polynom nehme, brauch ich 8 Byte als Anhang. Ist 
dementsprechend ein 32 bit Schlüssel schneller, langsamer oder 
gleichschnell im Bezug auf Rechenzeit, weil ich mit einem grösseren 
Polynom dann ja weniger Prüfzeichen senden müsste.

@Sonic: Ja ich programmier in C. genauer gesagt mit Dynamic C, ist eine 
ganz leicht abgewandelte Version davon. Leider gibts hier keine LIB's 
für CRC. Aber ein originaler C-Code würde mir schon reichen.

Gruss Paule

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie der Name schon sagt, besteht eine 16bit CRC aus 16 Bits. Macht die 
Übertragung 2 Bytes länger. Eine 32bit CRC macht sie folglich 4 Bytes 
länger. Und die Rechenzeit hängt auch davon ab, ob du eher auf Platz 
oder Zeit optimierst, wobei bei einer 32bit CRC eine von Haus aus 32bit 
breite Datenverarbeitung deutliche Vorteile hat.

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Paule wrote:
>
> ich will 15 Char-Bytes ueber die serielle Schnittstelle meines uC
> senden. Diesen 15 Bytes will ich ein 1-3 Byte langes Kontrollzeichen
> anhaengen. Habt ihr einen Vorschlag wie ich das am Besten machen
> koennte(CRC etc., vielleicht hat jemand ja einen passenden Alg. auf
> Lager) und habt ihr vor allem ein C-CODEBEISPIEL dafuer???

Es kommt darauf an, ob Du Fehler erkennen und reparieren willst oder nur 
wissen willst, ob was falsch war und wie zuverlässig dies dann wiederum 
sein muß.
Am einfachsten ist eine Prüfsummenbildung durch Addition aller 
Datenbytes und anschließender UND Verknüpfung mit 0xFF. Das 
resultierende Byte ist als Prüfusmme für die wenige Nutzdatenbytes denke 
ich ausreichend.

Autor: Paule (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Florian.

Danke fuer die Antwort. Ich will nur pruefen, keine Korrektur vornehmen.
Aber was soll es bringen am Schluss eine UND-Verknuepfung mit FF zu 
machen, da aendert sich doch nichts am Pruefbyte oder?
Gruss Paule

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Paule wrote:
> machen, da aendert sich doch nichts am Pruefbyte oder?

Doch, wenn Du mehrere Bytes addierst, kann es sein, daß Du ein Ergebnis 
bekommst, welches länger als ein Byte ist. Durch die Und-Verknüpfung 
reduzierst Du es auf das niederwertige Byte. Das spart Daten und genügt 
meistens als Genauigkeit

Bsp:
0x0A + 0xFA = 0x104
0x104 & 0xFF = 0x04 (Prüfbyte)

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das &0xFF kann man sich sparen, wenn man die Variable nur 1Byte groß 
macht.
Ich mache das immer so:
Sender:
Checksum=Summe aller Daten Werte
Checksum =256-Checksum
Diesen Wert sende ich.

Empfänger:
Checksum=Summe aller empfangenen Werte (einschließlich Checksum)

Wenn die Checksumme 0 ist ist alles OK, ansonsten gab es einen Fehler.
Das ermöglicht eine sehr einfache Überprüfung beim Empfänger.

Autor: Prüfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im allgemeinen werden Bytes mittels XOR verknüpft.

1. auf der Senderseite das entstandene Prüfbyte als 16tes Byte 
übertragen
2. auf der Empfängerseite das Prüfbyte der ersten 15 Bytes bilden und 
mit dem empfangenen vergleichen.

Autor: Paule (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hei Leutz,
danke fuer die Antworten, haben mir sehr geholfen.
Ich hab jetzt meinen Algorithmus implementiert und er funktioniert auch 
ganz gut.
NUR: Wenn ich die Pruefsumme fuer einen konstanten String berechnen 
lasse, bekomme ich immer die gleiche Pruefsumme heraus, was ja logisch 
ist.
Aber wenn ich einen String, den ich jeweils vorher veraendert habe 
pruefen lasse kommen immer 5 verschiedene Ergebnisse heraus beim 
gleichen Datensatz.
Das liegt meiner Meinung nach garantiert nicht am Algorithmus, sondern 
z.B. an dem String oder seiner Speicherung. Ich habe den string immer an 
der gleichen Stelle gespeichert und schreibe nur neue Daten rein.
Hat vielleicht einer ne Idee woran das liegen koennte????????
VG Paule




.
.
root void SerDTransmitt(char *s) {

      checksum=CalculateChecksum(s);   //meine Fkt. die funktioniert
                                       //bei Eingabe der gleichen Werte 
kommen
                                       //5 verschiedene Pruefsummen 
heraus


      ch7=CalculateChecksum(s2);    //Konstante zum Test der Fkt.
.                                   //hier klappts
.

Autor: usul27 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie du die Funktion aufrufst, ist nicht sonderlich spannend. Es wäre 
wohl wichtiger, den Code deiner Checksum-Routine hier reinzustellen.

Autor: Hansi Lein (fabian87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich kann dir nen crc check mit 8 bytes in pascal geben ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.