在delphi中发送多个十六进制代码

时间:2016-03-14 07:37:07

标签: android delphi

如何在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.

2 个答案:

答案 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个字符长度拆分字符串。