Code: Alles auswählen
var
txt : shortstring;
begin
txt := cbx_send.Text;
uart.Send(txt);
und gebe ihn byteweise an der Seriellen aus:
Code: Alles auswählen
procedure Tuart.Send(txt : shortstring);
var
btx : byte;
...
btx := Ord(txt[i]);
SerWrite(uhnd, btx, 1);
Eigentlich würde ich erwarten, dass im shortstring nur Zeichen mit der Länge 1 Byte stehen. Für Zeichen unter $7F funktioniert das auch.
Steht in meinem Eingabefeld aber ä,ö,ü oder Ähnliches, würde ich im shortstring unter Windows sowas wie $E4, $F6, $FC erwarten. Es stehen aber, und das habe ich auch im Debugger so gesehen, an der Stelle Widechars drin, nämlich $C3$A4, $C3$B6, $C3$BC. Für normale Buchstaben stehen für a, b, c $61, $62, $63, wie es sein soll.
Jetzt habe ich mal mit verschiedenen Konvertierungen und Compilerswitches rumprobiert, ich hab auch schon verschiedene Charaktersets für das Eingabefeld probiert, aber ich bekomme die Zeichen einfach nicht einstellig in den String. Dabei sollte es nach dieser Tabelle (http://wiki.freepascal.org/Better_Unicode_Support_in_Lazarus#String_Literals_Overview) eigentlich möglich sein, den String als shortstring weiterzugeben.
Es ist bestimmt ganz einfach, aber ich hab da gerade eine Denkblockade.
Disclaimer: Ja, ich weiss, es ist unschön Zeichen > $7F direkt zu senden, weil die beim Empfänger je nach Zeichensatz anders ankommen können. Aber dafür gibt es im Programm die Möglichkeit, Hex-Codes zu senden und zu empfangen. Ich könnte auch alles über $7F unterdrücken, aber ich will einfach mal wissen, warum das nicht geht.
Unter Purebasic geht der gleiche Kram mit Unicode-Compilierung übrigens problemlos, unter C++ mit Qt geht es, wenn ich den String mit toLocal8Bit konvertiere.