Hallo,
folgender Sachverhalt: Ich habe eine recht hübsche Shell auf einem
Controller, die über RS232 angesprochen werden kann. Hier kann man
einfache Befehle ausführen lassen oder sich Inhalte von bestimmten
Variablen printen lassen. Hierbei ist auch etwas Ausgabeflexibilität
gefragt. Ein Beispiel:
1 | bytes = [256] 0xAA // Erzeugt einen Byte-Array mit 256 Elementen und Wert 0xAA
|
2 | bytes? format 4 "%u " // Gibt den Array in 4-bytige unsigned integer Blöcke zerlegt aus, getrennt durch ein Leerzeichen
|
3 | bytes? format 1 "0x%X," // Zeigt die Bytes im Hex-Format an und trennt sie mit einem Komma
|
Oben genannte Beispiele funktionieren prima, da im Hintergrund die
Funktion vsnprintf() arbeitet, die den Formatstring (z.B. "0x%X")
entgegennimmt und auf die Daten der Shell-Variable "bytes" in args
anwendet und das Ergebnis im screenbuffer ablegt:
1 | vsnprintf(screenbuffer, 100, format, args);
|
Wenn ich jetzt aber möchte, dass mir immer nur ein Wert pro Ausgabezeile
ausgegeben wird, erscheint folgende Eingabe logisch, funktioniert aber
nicht, wie von mir erwartet:
1 | bytes? format 4 "%u\r\n"
|
Jetzt wird keine neue Zeile begonnen, sondern der String "\r\n" genau so
mit ausgegeben und alle Ergebnisse aneinander gehängt, was nicht im
Sinne des Erfinders liegt.
Warum reagiert vsnprintf hier so und interpretiert die eingegeben
Escape-Sonderzeichen nicht? Oder liegt's vielleicht am Terminalprogramm?
Wenn ich im Source-Code
1 | vsnprintf(screenbuffer, 100, format, args);
|
ersetze durch
1 | vsnprintf(screenbuffer, 100, "%u\r\n", args);
|
kommen die Zeilenumbrüche wie erwartet.
Wie bringe ich vsnprintf dazu, meine eingegebenen Escape-Zeichen zu
interpretieren anstatt sie nur zur Ausgabe durchzureichen?