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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.