Einzelnen Beitrag anzeigen

Geri

Registriert seit: 23. Nov 2004
Ort: Feldkirch
47 Beiträge
 
Delphi 2005 Personal
 
#1

Bluethooth auf Android - recvmsg stuck

  Alt 2. Jun 2020, 19:52
Hallo zusammen

Ich hoffe, bei euch ist alles bestens!

Ich habe hier eine Android-App (android 7.0), welche ich mit Delphi 10.3.3 community edition
erstellt habe. Über Bluetooth werden mit einem HC-05-6 Bluetooth-Modul
zyklisch Daten ausgetauscht.
Nach ein paar Minuten Laufzeit friert die App ein. Wenn ich den Debugger
stoppe, dann bleibt er in recvmsg "stecken"

Unter
MS-Windows - HC-05-6 läuft die Anwendung einwandfrei
Android-app mit einem ESP32-Bluetooth-Modul einwandfrei.

Anbei die Sende-Empfangsroutine.
Ich meine, das Problem entsteht in ReceiveBuffer := LSocket.ReceiveData(10);

Vielen Dank für eure Tipps

Geri

Delphi-Quellcode:
function TDROController.SendReceive(Cmd, DataLen:Word; Data:Array of Byte; ExpectedLength:DWord; var ReceiveLength:DWord; var InData:Array of Byte; Timeout:Word):Integer;
var
  LBuffer:TBytes;
  i :integer;
  CRC: Byte;
  ReceiveBuffer:TBytes;
  CurrentIdx:LongWord;
begin
  CRC:=$EF; // just fill it with dummy byte
  SetLength(LBuffer,4+ DataLen);
  LBuffer[0]:= $24; // Start identifier
  LBuffer[1] := Cmd; // command
  LBuffer[2]:= DataLen; // DataLen
  if DataLen > 0 then
    move(Data,LBuffer[3],DataLen); // Data
  move(CRC,LBuffer[3+DataLen],sizeof(CRC)); // CRC-Byte
  SetLength(ReceiveBuffer,0);
  result:=-1; // mark as error
  if Assigned(LSocket) then
  begin
    if LSocket.Connected then
    begin
      try
        LSocket.SendData(LBuffer);
        CurrentIdx:=0;
        for i := 0 to TimeOut div 10 do
        begin
          ReceiveBuffer := LSocket.ReceiveData(10);
          if length(ReceiveBuffer) > 0 then
          begin
            move(ReceiveBuffer[0],InData[CurrentIdx],length(ReceiveBuffer));
            CurrentIdx := CurrentIdx + length(ReceiveBuffer);
            SetLength(ReceiveBuffer,0);
            if CurrentIdx >= (ExpectedLength + 4) then
            begin
              result:=0;
              Setlength(LBuffer,0);
              exit;
            end;
          end;
        End;
        ReceiveLength:= CurrentIdx;
        Setlength(LBuffer,0);
      except
        on e: exception do
          AddDebug('Sendreceive Exception ' + E.Message );
      end;
    End;
  end;
  Disconnect();
end;
Gerhard
  Mit Zitat antworten Zitat