Forum: Mikrocontroller und Digitale Elektronik Interruptgesteuerter Empfang von Daten an UART


von Joline (Gast)


Lesenswert?

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

von Profi (Gast)


Lesenswert?

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.

von Tom (Gast)


Lesenswert?

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.

von Joline (Gast)


Lesenswert?

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

von Jens Renner (Gast)


Lesenswert?

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