Forum: Compiler & IDEs Uart String interrupt gesteuert empfangen


von Peter F. (piet)


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

von Helmut L. (helmi1)


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

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.