Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在delphi中发送多个十六进制代码_Android_Delphi - Fatal编程技术网

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

Android 在delphi中发送多个十六进制代码,android,delphi,Android,Delphi,如何在delphi中发送多个十六进制代码? 例如,我需要发送到串行端口的十六进制代码是1B和40。如何将其发送到串行端口?我可以发送十六进制代码到串行端口,但只有一个十六进制代码,如1B只,我有困难发送多个十六进制代码。提前谢谢 我的代码: unit uSample; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX

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

根据注释,此组件包含具有以下签名的方法:

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
添加类帮助程序这样的方法

请注意,在关于十六进制到底是什么的问题上存在一些混淆。您没有尝试向设备发送十六进制。十六进制是值的表示形式。这些值可以用十进制表示。因此,上述代码相当于:

WriteBytes([27, 64]);

十六进制只是写数字的许多方法之一。基础值是相同的。所以,
16=$0A
。您可以将值写入十进制、十六进制或其他表示形式。您发送的不是十六进制,而是字节。通俗地说,您正在发送二进制数据。

根据注释,此组件包含具有以下签名的方法:

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
添加类帮助程序这样的方法

请注意,在关于十六进制到底是什么的问题上存在一些混淆。您没有尝试向设备发送十六进制。十六进制是值的表示形式。这些值可以用十进制表示。因此,上述代码相当于:

WriteBytes([27, 64]);

十六进制只是写数字的许多方法之一。基础值是相同的。所以,
16=$0A
。您可以将值写入十进制、十六进制或其他表示形式。您发送的不是十六进制,而是字节。通俗地说,您正在发送二进制数据。

如果您想将字符串
1B40
解释为两个字节
$1B
$40
,然后将其发送到COM端口。首先,您需要将字符串“1B40”拆分为单独的十六进制文本,例如“1B”和“40”(代码来自)

要将字符串拆分为字符串列表,每个字符串由2个字符长度组成。对于字符串列表中的每个项,您可以使用将其十六进制字符串转换为字节表示形式,并将其写入COM端口。请注意,
stroint()
将字符串“$1B”解释为整数$1B

for i:=0 to aHexStrings.count-1 do
begin
  AComPort1.writeByte(Byte(StrToInt('$'+aHexStrings[i])));
end;
这段代码肯定不是那么快,因为字符串拆分任务和一次写入一个字节的开销很大


如果输入字符串为$1B$40,则可以避免在writeByte()过程中使用“$”串接,如上例所示,但需要将每3个字符长度的字符串拆分。

如果要将字符串
1B40
解释为两个字节
$1B
$40
,然后将其发送到COM端口。首先,您需要将字符串“1B40”拆分为单独的十六进制文本,例如“1B”和“40”(代码来自)

要将字符串拆分为字符串列表,每个字符串由2个字符长度组成。对于字符串列表中的每个项,您可以使用将其十六进制字符串转换为字节表示形式,并将其写入COM端口。请注意,
stroint()
将字符串“$1B”解释为整数$1B

for i:=0 to aHexStrings.count-1 do
begin
  AComPort1.writeByte(Byte(StrToInt('$'+aHexStrings[i])));
end;
这段代码肯定不是那么快,因为字符串拆分任务和一次写入一个字节的开销很大


如果您的输入字符串为$1B$40,则可以避免在writeByte()过程中使用“$”串接,如上例所示,但您需要为每3个字符长度拆分一个字符串。

您必须首先清楚地了解问题,才能说明问题。你在发送hex?这是文本。以16为基数的值的表示形式。还是发送二进制字节?你明白吗
16=$10
?那么,您是发送文本还是二进制文件?怎么做?你的代码在哪里?所以你不是想发送十六进制,而是想发送二进制。如果你能发送一个字节,你就不能发送多个。很难看出你的问题是什么。我试着用$1B+40和$1B$40发送它,但仍然不起作用,但如果它只是一个像$0A这样的代码,它就起作用了。顺便说一句,谢谢你的回答。问题中的代码发送一些文本,编码为UTF8,然后是一个字节。它只尝试发送一个字节,但您说要发送多个字节。你为什么发短信?发送多个字节的代码在哪里?组件是否有发送字节数组的方法?你现在明白了吗?@SirRufo
WriteByte($0A)
,去掉了无意义的强制转换,似乎处理的是字节而不是字符。它与
WriteByte(10)
相同。需要说明的是,
$10
不是一个字符,而是一个整数文本。你必须首先清楚地理解这个问题,并说明它。你在发送hex?这是文本。以16为基数的值的表示形式。还是发送二进制字节?你明白吗
16=$10
?那么,您是发送文本还是二进制文件?怎么做?你的代码在哪里?所以你不是想发送十六进制,而是想发送二进制。如果你能发送一个字节,你就不能发送多个。很难看出你的问题是什么。我试着用10亿美元+40美元发送,10亿美元40美元仍然不起作用,但如果