mikrocontroller.net

Forum: Compiler & IDEs Uart String interrupt gesteuert empfangen


Autor: Peter F. (piet)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Es handelt sich um Daten die über die UART rein kommen, pollen kommt 
nicht in frage, um eine Prüfung ob die Daten gültig sind muss ich mir 
erstmal keine Gedanken machen.

Da ich nicht wirklich Erfahrung ud Ahnung davon habe, frage ich mich was 
wohl der beste Ansatz ist.
Nicht falsch verstehen, ich kann den nötigen C-Code dazu schreiben aber 
bin mir unsicher ob das eine elegante Lösung ist.

0x00 kann und darf nicht enthalten sein
Jedes Byte des Strings kann einen Wert von 0x01 bis 0xFF darstellen
Länge des Strings ist variabel
bestimmte byte folgen können nicht in den Nutzdaten vorhanden sein

Ich macht jetzt folgendes, eine Sequenz die nicht vorkommen kann wähle 
ich als Startsequenz, eine weitere als Stop Sequenz und baue den String 
so auf:

Sartsequenz - Byte mit länge des Strings - Nutzdaten - Entsequenz

Und hier der Pseudocode zum auswerden:

Zähler für Stelle im buffer: i
Indikator für Stringlänge: länge
Datenpuffer: buffer
Variable in die neue Daten kopiert werden: string

ISR (USART_RXC_vect) {
 buffer[i] = UDR;

 if ( (i-= 1 == startbyte1) && (i-= 2 == startbyte2) && (i >= 2)) {
  länge = buffer[i];
 }

 if ( (i += länge == endbyte1) && (i += länge +1 == endbyte 2) {
 string = buffer;
 länge = 0;
 i = 0;
 }

 if ( i ++ => 20 ) {
  buffer = 0;
 }
}

Problem ist jetzt, der Buffer kann umlaufen, also der Empfangene String 
könnte liegen von buffer[10] bis buffer[5] wenn vorher unvollständige 
Strings empfangen wurden und der "untere" teil der buffers mit Müll 
gefüllt ist.
Das sollt ich auch irgendwie berücksichtigt bekommen, fällt mir nur 
spontan nix passendes zu ein.

Ist der Ansatz so generell ok?

Grüße,
Peter

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zuerst machst du dir einen Ringbuffer. In dem speicherst du bei einem 
Interrupt das empfangene Zeichen. So hast du erstmal das Problem weg das 
du den Uart permanent abfragen must. In deiner Hauptroutine kannst du 
jetzt in aller Ruhe die Zeichen aus dem Buffer auslesen und dein 
Datenprotokoll bearbeiten. So hast du dein Problem in 2 Teilprobleme 
aufgesplittet. Du must nur sicherstellen das in deinem Hauptprogramm in 
regelmässigen Abständen der Puffer ausgelesen wird. So kann dann dein 
Ringbuffer nicht überlaufen.

Gruss Helmi

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.