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 ??
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.