Mit Chr und String währe ich aber vorsichtig. Die Umwandlung aus deiner Bytefolge etwas ganz anderes machen als erwartet.
Hier währe TBytes als Buffer(für die zu übertragene Bytefolge) und eine Funktion die direkt eine Bytefolge überträgt sinnvoller.
Delphi-Quellcode:
function BuildCommand(ACommand: Byte; AData: const array of Byte): TBytes;
var
CheckSum, B: Byte;
begin
SetLength(Result, 2 + Length(AData));
CheckSum := ACommand;
Result[0] := ACommand;
for var n := 0 to High(AData) do
begin
B := AData[n];
CheckSum := CheckSum xor B;
Result[1 + n] := B;
end;
Checksum := CheckSum xor $FF;
Result[High(Result)] := CheckSum;
end;