Uart String interrupt gesteuert empfangen

OP #1479014
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
#1479027
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren