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.