Interruptgesteuerter Empfang von Daten an UART

Gast #108026
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
Gast #108027
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.
Gast #108029
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
Gast #108030
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.