Android 将十六进制字符转换为TArray<;字节>;用于发送到通信端口

Android 将十六进制字符转换为TArray<;字节>;用于发送到通信端口,android,delphi,serial-port,Android,Delphi,Serial Port,我最近从获得了一个Android的通讯端口库 到目前为止,这使我能够将字符发送到通过OTG电缆连接到设备的LoRa设备。现在我想向设备发送配置十六进制。我能够在VCL中使用类似的方法实现目标: 现在我想在Android FMX中做同样的事情 这是我的尝试(不起作用),显然我对这些事情需要如何做的理解太肤浅了。感谢您的帮助 procedure TFormMain.btnSendHexClick(Sender: TObject); var Line, Str: String; Buffer:

我最近从获得了一个Android的通讯端口库

到目前为止,这使我能够将字符发送到通过OTG电缆连接到设备的LoRa设备。现在我想向设备发送配置十六进制。我能够在VCL中使用类似的方法实现目标:

现在我想在Android FMX中做同样的事情

这是我的尝试(不起作用),显然我对这些事情需要如何做的理解太肤浅了。感谢您的帮助

procedure TFormMain.btnSendHexClick(Sender: TObject);
var
  Line, Str: String;
  Buffer: TJavaArray<Byte>;
  i: Integer;
begin
  Line := 'AFAF0000AF8002020000910D0A';
  Str := HexToString(Line);
  Buffer := TJavaArray<Byte>.Create(Length(Str));
  i := 0;
  while i < Length(Str) do
  begin
    Buffer[i] := Ord(Str[i]);
    Inc(i);
  end;
  SerialDevice.syncWrite(Buffer, 1000);
end;

function TFormMain.HexToString(const S: String): String;
var
  LOutput: TBytes;
  Len: Integer;
begin
  SetLength(LOutput, Length(S) div 2);
  Len := HexToBin(PChar(S), 0, LOutput, 0, Length(LOutput));
  Result := TEncoding.ASCII.GetString(LOutput, 0, Len);
end;
过程TFormMain.btnSendHexClick(发送方:TObject);
变量
行,Str:String;
缓冲区:TJavaArray;
i:整数;
开始
行:=“AF0000AF8002020000910D0A”;
Str:=六角管柱(直线);
Buffer:=TJavaArray.Create(长度(Str));
i:=0;
而我<长度(Str)做
开始
缓冲区[i]:=Ord(Str[i]);
公司(一);
结束;
SerialDevice.syncWrite(缓冲区,1000);
结束;
函数TFormMain.HexToString(常量S:String):String;
变量
LOutput:t字节;
Len:整数;
开始
设置长度(百叶窗,第2部分长度);
Len:=六角体(PChar(S),0,LOutput,0,长度(LOutput));
结果:=TEncoding.ASCII.GetString(LOutput,0,Len);
结束;

是的,
SerialDevice.syncWrite
函数接受
TJavaArray
作为第一个参数。第二个参数是超时(毫秒)值。

它以什么方式不工作?发生了什么?HexToString毫无意义。你是说海克斯托宾吗?字符串不是字节数组。在VCL版本中,它实际上是hextoString。也许在Android版本中,该函数的命名更为恰当。但这并不能帮助我解决这个问题。@DSM。当LoRa设备接收到正确的配置字符时,它会用十六进制配置字符串进行响应。正如我所说,这在VCL上起作用。在Android实现中,设备将字符发送到另一个LoRa。也就是说,它不会将它们识别为配置设置。您会询问如何将十六进制字符串转换为字节数组。但是你不能那样做。而是尝试转换为字符串。你到底想做什么。难道你看不到
LOutput
包含一个字节数组吗?
procedure TFormMain.btnSendHexClick(Sender: TObject);
var
  Line, Str: String;
  Buffer: TJavaArray<Byte>;
  i: Integer;
begin
  Line := 'AFAF0000AF8002020000910D0A';
  Str := HexToString(Line);
  Buffer := TJavaArray<Byte>.Create(Length(Str));
  i := 0;
  while i < Length(Str) do
  begin
    Buffer[i] := Ord(Str[i]);
    Inc(i);
  end;
  SerialDevice.syncWrite(Buffer, 1000);
end;

function TFormMain.HexToString(const S: String): String;
var
  LOutput: TBytes;
  Len: Integer;
begin
  SetLength(LOutput, Length(S) div 2);
  Len := HexToBin(PChar(S), 0, LOutput, 0, Length(LOutput));
  Result := TEncoding.ASCII.GetString(LOutput, 0, Len);
end;