如何在delphi中发送多个十六进制代码? 例如,我需要发送到串口的十六进制代码是1B和40.如何将其发送到串口?我可以发送十六进制代码到串口,但只有一个十六进制代码,如1B,我很难发送多个十六进制代码。提前谢谢。
我的代码:
unit uSample;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, Winsoft.Android.ComPort,
FMX.Edit, FMX.StdCtrls;
type
TForm1 = class(TForm)
AComPort1: TAComPort;
Memo1: TMemo;
Timer1: TTimer;
Button1: TButton;
Edit1: TEdit;
Open: TButton;
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure OpenClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.Button1Click(Sender: TObject);
begin
AComPort1.Active := False;
AComPort1.DeviceName := Edit1.Text;
AComPort1.Active := True;
AComPort1.WriteUtf8(Memo1.Text);
AComPort1.WriteByte(Byte($0A));
end;
procedure TForm1.OpenClick(Sender: TObject);
begin
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var Text: string;
begin
end;
end.
答案 0 :(得分:6)
根据评论,该组件包含具有以下签名的方法:
procedure Write(Buffer: Pointer; Count: Integer; WaitForCompletion: Boolean);
这可能是所有其他写入方法都通过的低级方法。您可以使用接受字节数组的高级方法将其包装起来:
procedure TForm1.WriteBytes(const Buffer: array of Byte);
begin
if Length(Buffer) > 0 then begin
AComPort1.Write(@Buffer[0], Length(Buffer), True);
end;
end;
我假设您将True
传递给最终参数并使呼叫同步。
然后您可以调用这样的方法:
WriteBytes([$1B, $40]);
如果您对班助手感到满意,可以将此方法作为TComport
的班助手添加。
请注意,关于hex究竟是什么的问题存在一些混淆。您没有尝试将十六进制发送到设备。十六进制是值的表示。这些值同样可以表示为十进制。所以上面的代码相当于:
WriteBytes([27, 64]);
十六进制只是记下数字的众多方法之一。基础价值是相同的。所以,16 = $0A
。您可以将值写为十进制,十六进制或实际上在其他表示中。你没有发送十六进制,你发送字节。通俗地说,您正在发送二进制数据。
答案 1 :(得分:1)
如果要将字符串1B40
解释为两个字节$1B
和$40
,然后将其发送到COM端口。首先,您需要将字符串' 1B40`拆分为单独的十六进制文本,例如' 1B'和' 40'例如(代码来自this question)
procedure StrToStringList(const aSource: String;
const aList: TStrings;
const aFixedLen: Integer);
var
idx: Integer;
srcLen: Integer;
begin
aList.Capacity := (Length(aSource) div aFixedLen) + 1;
idx := 1;
srcLen := Length(aSource);
while idx <= srcLen do
begin
aList.Add(Copy(aSource, idx, aFixedLen));
Inc(idx, aFixedLen);
end;
end;
然后你打电话
aHexStrings = TStringList.create();
StrToStringList(Memo1.Text, aHexStrings,2);
将字符串拆分为字符串列表,每个字符串由2个字符长度组成。对于字符串列表中的每个项目,使用StrToInt()将其十六进制字符串转换为其字节表示形式,并将其写入COM端口。请注意,StrToInt()
会解释字符串&#39; $ 1B&#39;整数$ 1B。
for i:=0 to aHexStrings.count-1 do
begin
AComPort1.writeByte(Byte(StrToInt('$'+aHexStrings[i])));
end;
这段代码绝对不是那么快,因为字符串拆分任务的开销一次写一个字节。
如果您的输入字符串是$ 1B $ 40,那么您可以避免字符串连接&#39; $&#39;在writeByte()期间,如上例所示,但您需要为每个3个字符长度拆分字符串。