Hallo, ich benutze zum Empfang von Daten über UART die folgende Funktion: volatile unsigned char data[32]; SIGNAL (SIG_UART_RECV) { *data += UDR; ... } Die Funktion wird bei jedem Zeichen, dass über UART reinkommt, aufgerufen und aus UDR wird dann das Zeichen ausgelesen. Funktioniert soweit auch prima. Nun wird aber von dem Sender eine Zeichenkette gesendet. Bei jedem einzelnen Zeichen dieser Zeichenkette wird die Funktion aufgerufen und ich kann das empfangenen Zeichen an eine string-Variable anhängen. Die Zeichenketten sind unterschiedlich lang und haben kein Ende- kennzeichen. Zwischen den einzelnen Zeichenketten gibt es aber mehr oder weniger eine Pause. Wie kann ich erkennen, dass eine Zeichenkette komplett ist? Joline
Lasse einen Timer mitlaufen, den Du bei jedem empfangenen Zeichen zurücksetzt. Wenn längere Zeit keine Zeichen kommen, läuft der Timer aus/über und generiert einen Interrupt (wenn Du ihm vorher sagst, er soll es tun). Dann weißt Du, das der String komplett ist.
Wenn die Zeichenketten bekannt sind, also bspw. Kommandos oder Ähnliches, dann würde ich das über eine Statemachine machen. Das spart den Aufwand mit dem Timer und erleichtert die Auswertung.
Das mit dem Timer habe ich mir auch schon überlegt. Aber ich dachte, es gibt vielleicht eine elegantere Lösung so in der Art "String Complete Register" bei dem der UART selber merkt, wenn in kürzester Zeit viele Zeichen kommen, gehören die zusammen und wenn eine Pause ist, ist die Sendung eben beendet. @Tom: Die Zeichenketten sind zwar im Prinzip bekannt, aber es ist nicht immer sicher, wie viele Zeichen die Zeichenkette enthält. Es gibt einen Kopf, in dem eine Adresse drinsteht, dann ein Funktionscode und anschliessend eine variable Anzahl Daten. Joline
Ist eigentlich kein sehr optimales Protokoll, wenn nach einer variablen Anzahl an Parametern kein Stopbyte o.ä. folgt. Da hilft auch eine Statemachine nicht viel. Das mit dem "viele Zeichen in kurzer Zeit und dann eine Pause" wäre ein typischer Fall für den Timer. Wie schon von Profi erwähnt: nach dem Empfang den Timer zurücksetzen, und nach einem Überlauf ist der String komplett. Ein Problem hat man nur, wenn innerhalb der Wartezeit bereits ein neuer String anfängt.
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.