Ich habe auch eine uralte serielle Library beim Umstieg auf Delphi XE konvertiert und intern dafür AnsiString/AnsiChar/PAnsiChar verwendet, was ohne großen Aufwand über die Bühne ging (konvertieren auf TBytes hätte eine Menge mehr Arbeit bedeutet). Bei mir geht das problemlos weil intern Strings verwendet werden von außen aber Daten (Bytes/Word/DWord/Float) angeliefert werden.
Dein Problem liegt aber wohl darin, dass du diese Trennung nicht machen kannst weil du direkt im Programm mit den Strings arbeitest. Aus meiner Sicht gibts daher nur zwei Möglichkeiten:
1. Hardcast über AnsiString und AnsiChar für alles was mit dem Protokoll zu tun hat:
Code:
Const
ETX = AnsiChar(2); //stellvertretend für alle Steuercodes....
CHeader: AnsiString = #230'vorne'#231;
procedure TForm4.Button1Click(Sender: TObject);
Var
Header: AnsiString;
begin
Send(CHeader+AnsiString('Meine Daten'#$F3#$EE'hinten')+ETX);
end;
procedure TForm4.Send(AString: AnsiString);
begin
//hier sollte alles passen
end;
2. Konvertieren vor dem Senden.
Das ist einwenig "riskant", abhängig von den Daten (siehe weiter unten)
Code:
Const
ETXu = #2;
CHeaderu = #230'vorne'#231;
procedure TForm4.Button2Click(Sender: TObject);
Var
Header: String;
begin
Sendu(CHeader+'Meine Daten'#$F3#$EE'hinten'+ETX)
end;
procedure TForm4.Sendu(AString: String);
Var
iSend: AnsiString;
i: Integer; // könnte auch TByte sein...
begin
// konvertieren in AnsiString
SetLength(iSend, Length(AString));
for i := 0 to Length(AString) do
begin
iSend[i] := AnsiChar(AString[i]);
end;
// jetzt kann iSend übertragen werden...
end;
Probleme bringt diese Version immer dann wenn du Zeichen ausserhalb des
Ansi-Bereichs senden möchtest also etwa:
denn in deinem Code darfst du nur Zeichen bis 127 zwischen den Anführungszeichen verwenden, alles andere muss in der Form #xxx angegeben werden. Auch eine Wandlung von
Unicode nach
Ansi ist in Sendu() nicht möglich.