Ich denke man braucht dedizierte Steuerzeichen (das heißt Zeichen, die nur Steuerzeichen sind). Ob das nun historische wie LF oder CR sind, ist dabei natürlich erstmal wurscht.
Um jetzt bei einem reinen binären Datenstrom noch zusätzlich Steuerzeichen zu gewinnen, arbeitet man mit einem Escape-Zeichen.
Gerne wird dafür der Wert 0x1B (ESC) verwendet.
Will man ein Steuerzeichen einfügen sendet man zuerst ein ESC und dann das Steuerzeichen.
Da der Wert 0x1B aber auch in den Daten vorkommen kann, sendet man in diesem Falle zwei mal ESC.
Die Logik verstehe ich nicht ganz. Wenn der Wert des Steuerzeichens auch in den Daten vorkommen kann, wie kann man dann ausschließen, dass es sich bei einem "scheinbaren" Steuerbefehl nicht zufällig um zwei Datenwerte handelt, die aussehen wie ein Steuerbefehl. Also konkret: wenn 0x1B einen Befehl markieren würde und ein 0x50 würde zB die Ausgabe von der folgenden drei Bytes (binary) auf einem LCD bedeuten, wie wäre der Fall davon zu unterscheiden, dass einfach zufällig dezimal 27 und 80 in einem anderen Zusammenhang aufgetaucht sind? Sich nämlich darauf zu verlassen, dass man immer sicher im Leseraster ist (was natürlich eine Lösung wäre), finde ich etwas gewagt ... Oder habe ich da irgendwo einen Denkfehler?
Ich hab auch schonmal ein Testprogramm in
Bascom geschrieben, das nicht erst auf CrLf warten soll, sondern direkt das jeweils empfangene Byte aufnimmt, allerdings kam so keine Kommunikation zustande.
Hm, verstehe ich nicht ganz ... Ich verwende zwei Varianten. Die eine ist im Hauptloop - also quasi durch permanentes Polling - mit
Code:
If Ischarwaiting() = 1
jeweils zu gucken ob was im UART Puffer für mich zum abholen liegt, und falls ja, es mit
Code:
Uart_buf(uart_buf_i) = Inkey()
abzuholen. Meist schreibe ich die Zeichen in einen Ringpuffer, den ich dann nach jedem neuen Byte nach der Sequenz absuche, die das Ende der Nachricht signalisiert (bei mir idR CR/LF, das kann definitionsgemäß nicht als Datenwerte vorkommen). Wenn das Ende erreicht ist, wird eine Anzahl Bytes vorher im Ringpuffer, die der Nachrichtenlänge entspricht ausgewertet. Das heißt in meinem Falle von Hex (String) nach Dezimal (oder wie auch immer man die Variable dann interpretiert) umgewandelt. Meist schleppe ich noch einen 8 bit CRC Wert mit, der dann noch ausgewertet wird.
Die andere Varainte geht fast genauso, da verwende ich dann allerdings den urxc Interrupt, dh mit
wird bei jedem neuen Zeichen die entsprechende ISR angesprungen, die dann die Auswertung wie eben gesagt macht.
Ist methodisch nicht sehr intellektuell und die Codierung ist auch "far from optimal", aber es funktioniert stumpf 
Gruß
Malte
Lesezeichen