如何在Delphi中将十六进制字符串转换为十六进制数据?

时间:2018-03-19 23:56:55

标签: string delphi hex

我正在使用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;  

1 个答案:

答案 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发送。