Forum: Mikrocontroller und Digitale Elektronik USART Abfangen von Fehler?


von Hansi A. (sth34)


Lesenswert?

Hallo,

ich hoffe mal das mir jemand hier weiterhelfen kann. Versuche gerade 
eine USART Verbindung zwischen zwei Controllern der Atmega16 Serie 
fehlerfrei und sicher herzustellen. Die Empfängerseite Arbeitet mit 
einem Interrupt wenn ein Zeichen ankommt und speichert dies in ein 
zweidimensionales Array.

Ich habe mir dabei eine Funktion Senden geschrieben die Daten nach 
folgenden Format sendet:
1. Senden des Index Wertes
2. Empfänger sendet Wert zurück
3. Senden des Eigentlichen Wertes
4. Empfänger sendet Wert zurück
5. Sender vergleicht empfangene Daten mit Gesendeten Daten und sendet 
bei
   ok eine 1 zurück an den Empfänger der dann aus der Interrupt Routine
   springt.
Dies Funktioniert einwandfrei solange keine Störungen wie z.b. 
Einschalten, Reset einer der Controller oder ungültiges Frame Format 
oder ähnliches auftritt. Dann kommt die Sende und Empfangsroutinen 
durcheinander. Ich habe hier, aber auch im Datenblatt, keine vernüftige 
Funktion geshen, die solche Fälle abfangen können. Hat irgendjemand eine 
Idee wie man so was sicher machen kann ??? Oder wo ich so was finde ??

von Karl H. (kbuchegg)


Lesenswert?

Du hast das Wichtigste vernachlässigt.
Du hast kein oder nur ein ungenügendes Protokoll.

Ein Protokoll muss auf jeden Fall 2 Dinge gewährleisten:
* Der Empfänger muss eindeutig bestimmen können, wann ein Datensatz 
anfängt
* und er muss eindeutig bestimmen können, wann ein Datensatz zu Ende 
ist.

Nur so gelingt es dir, dass sich ein Empfänger in einen laufenden 
Datenstrom einklinken kann und sich nach kurzer Zeit mit dem Sender 
synchronisieren kann.

Bsp
Dein Protokoll sehe zb so aus:
Erstes Zeichen eines Datensatzes (es wird ASCII übertragen) ist immer 
ein 'I' wie Index. Darauf folgt die Indexnummer, gefolgt von einem 'W' 
(wie Wert) und dem Zahlenwert.
Damit schaffst du es schon mal dich in den Datenstrom
67I5W874I9W-321I2W23
einzuklinken und daraus die Datensätze
I 5 W 874     Setze Index 5 auf 874
I 9 W -321    Setze Index 9 auf -321
zu extrahieren.
die 67 vor dem ersten I werden ignoriert. Der Empfänger hat sich mitten 
in eine Übertragung eingeklingt und kann damit nichts anfangen. Für ihn 
beginnt die Übertragung erst mit dem ersten Zeichen welches ihm 
zweifelsfrei sagt, wo ein Datensatz anfängt
Was ist mit dem I2W23 welches noch kommt? Der Empfänger kann damit noch 
nichts anfangen. Erst wenn ein nächstes I kommen würde, wüsste er 
zweifelsfrei dass dieser Datensatz abgeschlossen ist. Anstatt dem I 
könnte ja auch noch eine 8 kommen und der Datensatz damit
I 2 W 238
lauten. Und nach der 8 könnte noch eine 5 kommen und den Datensatz so zu
I 2 W 2385 aufbohren.

-> Eine Endekennung muss her, damit der Empfänger auch zweifelsfrei 
weiß, wann ein Datensatz tatsächlich zu Ende ist. Selbst dann wenn der 
Sender nichts mehr hinten nach sendet.

Du könntest zb vereinbaren, dass jeder Datensatz immer mit einem ; 
abgeschlossen wird.
67;I5W874;I9W-321;I2W23;

jetzt ist alles klar. In diesem Datenstrom sind die Datensätze
I 5 W 874
I 9 W -321
I 2 W 23
zweifelsfrei identifizierbar.

Den HäckMäck mit Daten hin und zurück schicken hingegen kannst du dir 
sparen. Das bringt nichts. Wenn du willst, dann mach eine Prüfsumme über 
die Index und Werte und schicke die noch hinten nach. Der Empfänger 
berechnet ebenfalls die Prüfsumme über das was er empfangen hat und 
vergleicht sie mit der empfangenen. Stimmen sie nicht überein, dann ist 
ein Übertragungsfehler passiert. Wenn die Prüfsummen übereinstimmen, 
heißt das zwar nicht automatisch, daß es keinen Übertragungsfehler gab, 
aber der Fall ist eher unwahrscheinlich.

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.