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
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
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
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
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 :-(
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.
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
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.
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.
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.
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
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
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.
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
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.
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.
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.
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
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