我正在使用TComPort库,向我需要以十六进制数据发送命令的设备发送请求,如下例所示
procedure TForm1.Button3Click(Sender: TObject);
begin
ComPort1.WriteStr(#$D5#$D5);
end;
但这是一个硬编码的例子。
如何将S
转换为ComPort1.WriteStr
procedure TForm1.Button3Click(Sender: TObject);
var
S:String;
begin
Edit1.Text:='D5 D5';
ComPort1.WriteStr(Edit1.Text);
end;
答案 0 :(得分:2)
您不会通过端口发送实际的十六进制字符串。这只是在编译时在源代码中编码二进制数据的一种方法。 #$D5#$D5
正在编码2个字符串字符,其数值为213
(取决于{$HIGHCHARUNICODE}
,默认情况下为OFF。)
TComPort.WriteStr()
期望发送实际字节,而不是十六进制字符串。如果您希望用户输入以二进制数据形式发送的十六进制字符串,请查看Delphi的HexToBin()
函数以进行该转换。
话虽如此,请注意Delphi 2009+中的string
是16位Unicode,而不是8位ANSI。您应该使用TComPort.Write()
来发送二进制数据而不是TComPort.WriteStr()
,例如:
procedure TForm1.Button3Click(Sender: TObject);
var
buf: array[0..1] of Byte;
begin
buf[0] := $D5;
buf[1] := $D5;
ComPort1.Write(buf, 2);
end;
但是,TComPort.WriteStr()
将接受一个16位的Unicode字符串,并通过简单地剥离每个Char
的高8位来将其作为8位二进制字符串传输。因此,如果您发送一个包含两个Char($D5)
值的字符串,它将以2个字节$D5 $D5
发送。