Hallo, ich überleg mir gerade eine einfache Möglichkeit, die Übertragungssicherheit vom PC zu einem Microcontroller zu gewährleisten. Reicht es aus, ähnlich wie beim Intel-Hex-Format einfach eine negative Checksumme ans Ende zu hängen? Es wäre halt einfach zu implementieren. Ich könnte mir auch vorstellen, ans Ende der Übertragung das Ergebnis einer exklusiven Veroderung aller Bytes zu hängen. Welche von den beiden Methoden wäre sicherer/besser? MW
Kommt auf dein Datenformat (Blöcke, Strom, sonstwas) und andere Randbedingungen (Prozessorzeit etc.) an, ob du Daten neu anfordern kannst oder lieber aus defekten Daten Fehler rausrechnest. XOR/MOD etc. sind auf alle Fälle gute Kandidaten um Fehler einfach zu finden und zu akzeptieren. Wenns darüber hinausgeht wirds komplexer. Grüße, Hendi
Wenn AVR und C, dann findet sich in der avrlibc eine crc16 Routine, die sich exzellent zur Datenkontrolle eignet, viel besser als jede Prüfsumme. Und auch auf den PC übertragbar ist.
'Cyclic redundancy check' (CRC) ist doch eine Prüfsumme, oder? Ist in der Tat am sichersten!
Für normale Sicherheit ist CRC (8 oder 16Bit) sicherlich zu bevorzugen. Und für das ganze ist sicherlich keine Lib erforderlich. Einfach jeweils ein oder 2 Byte zu der Summe addieren, am Schluss den Overflow unten wieder dazu, Einerkompliment, Fertig. Beim Kontrollieren alle Bytes inkl. Summe zusammenzählen, solle Null ergeben. Aufwand: 10min und ca. 20 Zeilen in ASM. Falls es dann doch mit Fehlererkennung sein sollte, gibts Sachen wie (n,k) Block Codes und Viterbi Decoding.
Momentan stelle ich mir gerade die Sinnfrage, aber das wird mir Michael sicher beantworten können... Die Datensicherheit eines vernünftigen RS232-Kabels bis zu einer Länge von 30m, gepaart mit einem sauber layouteten MAX232-Areal auf der Controller-Platine, verbunden mit dem äußerst umgänglichen AVR-USART, da liegt die Fehlerrate (zumindest bei meinen Schaltungen) bei nahezu 0,00%, ist da CRC nicht ein wenig oversized?
Summen oder EXORs haben den Nachteil, daß sich viele Fehler kompensieren können (korrekter Prüfwert trotz 2 Fehler). Eine CRC (Cyclic Redundancy Check) hat dagegen eine sehr gute Fehlererkennung und ist auch nicht viel aufwendiger: http://www.maxim.de/appnotes.cfm/appnote_number/27 Peter
CRC würde ich bei einer kabelgebundenen Übertragung auch nur benutzen wenn's auf absolute Sicherheit ankommt. Ansonsten sind da echt keine Fehler zu finden. CRC macht Sinn bei drahtloser Übertragung oder auf lange Strecken.
Das wollte ich damnit sagen ;-) vielleicht sagt der Michael ja noch mehr dazu.
@ALL: Danke für die Antworten... Hier mal die Specs: Kabel: 2m Baud: 115200 µC: AT89S53 Layout natürlich mit Masseflächen, jede Menge 100nF Caps an den ICs usw. Wenn ich euch richtig verstanden habe, kann ich auf die Prüfung verzichten. Dann prüf ich nur, ob richtige (sinnvolle) Daten ankommen, da ich noch nicht weiss, ob die Kommunikation wie jetzt im Entwicklungsstadium per Hyperterminal oder vielleicht mal per PC-Software gemacht wird. Bei Hyperterminal hat man sich ja gern schnell mal vertippt :-) MW
Ich kenn´ den 89S53 zwar nicht, aber Kontrollflags wird das UART wohl haben, so von wegen FrameError, DataOverrun und ParityError? Kannst ja noch ´ne Parität und noch ein StoppBit übertragen, dann wird der Frame länger und Fehler wirken sich stärker aus, wenn dann noch alles paßt, sollte die Verbindung gut sein.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.