www.mikrocontroller.net

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


Autor: Joline (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Joline (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens Renner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.