我使用的是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; 发布于 2018-03-20 08:11:14
您不会通过端口发送实际的十六进制字符串。这只是编译时在源代码中编码二进制数据的一种方式。#$D5#$D5使用数值213 (取决于{$HIGHCHARUNICODE} )对2个字符串字符进行编码。
TComPort.WriteStr()需要发送实际字节,而不是十六进制字符串。如果您希望用户输入十六进制字符串,然后将其作为二进制数据发送,请查看用于该转换的Delphi的HexToBin()函数。
也就是说,请注意Delphi中的string是16位的Unicode,而不是8位的2009+。你应该使用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发送。
https://stackoverflow.com/questions/49374294
复制相似问题