Teknologian jakaminen

Ongelma käytettäessä Delphiä Bluetooth BLE -kehitykseen

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

konsepti

Delphin BLE-kehitystä varten vedä TBlueToothLe käyttöliittymään ja käytä tätä säädintä BLE:n kehittämiseen, kuten Bluetooth-rannekkeen yhdistämiseen.

Delphin mukana tulevassa demossa on BLEScanner-ohjelma, jota voidaan käyttää kehityksen lähtökohtana.

kysymys

Jos yllä oleva ohjelma suoritetaan Windowsissa, laitteen skannauksen jälkeen, jos hiirellä napsautetaan laitetta, käyttöliittymä voi jäätyä eikä ohjelma vastaa. Tehtävienhallinta-aluetta tarkasteltaessa on totta, että ohjelma ei vastaa ja on kaatunut.

Syyanalyysi

Napsauta hiirtä tarkistaaksesi valitun laitteen palvelut. Sitten, kun laitteen palvelut löydetään, TBluetoothLE:n OnServicesDiscovered-tapahtuma käynnistyy. Tässä tapauksessa laitteen useita palveluja luetaan silmukassa, ja sitten tietyn palvelun merkin nimi luetaan silmukassa. Kaatuessa silmukassa lukee Hahmo.

Miksi se kaatui, en tiedä. Mutta löysin ratkaisun, koodi on seuraava:

  1. procedure TForm6.BluetoothLE1ServicesDiscovered(const Sender: TObject; const AServiceList: TBluetoothGattServiceList);
  2. var
  3. ServiceIndex: Integer;
  4. Service: TBluetoothGattService;
  5. CharacteristicIndex: Integer;
  6. Characteristic: TBluetoothGattCharacteristic;
  7. begin
  8. //以下代码如果不包到 TTask.Run 里面(原本的代码没有),在 WINDOWS 底下,执行到 for
  9. //CharacteristicIndex := 0 to Service.Characteristics.Count 会界面冻结,而且单步跟踪也停止
  10. //了,没有往下执行。
  11. TTask.Run(
  12. procedure
  13. var
  14. ServiceIndex: Integer;
  15. CharacteristicIndex: Integer;
  16. begin
  17. if AServiceList.Count > 0 then
  18. begin
  19. for ServiceIndex := 0 to AServiceList.Count - 1 do
  20. begin
  21. Service := AServiceList[ServiceIndex];
  22. TThread.Synchronize(nil,
  23. procedure
  24. begin
  25. Listbox2.Items.Add((ServiceIndex + 1).ToString + ' - ' + Service.UUIDName + ' - ' + Service.UUID.ToString);
  26. end
  27. );
  28. //以下代码会导致死机,如果断点跟踪,直接就是停在 for 这一行,不会继续往下执行。
  29. for CharacteristicIndex := 0 to Service.Characteristics.Count - 1 do
  30. begin
  31. Characteristic := Service.Characteristics[CharacteristicIndex];
  32. TThread.Synchronize(nil,
  33. procedure
  34. begin
  35. Listbox2.Items.Add(' - ' + Characteristic.UUIDName + ' - ' + Characteristic.UUID.ToString);
  36. end
  37. );
  38. end;
  39. end;
  40. end
  41. else
  42. TThread.Synchronize(nil,
  43. procedure
  44. begin
  45. Listbox2.Items.Add('- Access not allowed or no service available');
  46. end
  47. );
  48. end
  49. );
  50. //Listbox1.Enabled := True;
  51. end;

Koodin selitys

Yllä olevaan koodiin lisäsin TTask.Runin. Lisäsin myös TThread.Synchronize. Poista TTask.Run ja TThread.Synchronize ja jäljellä oleva koodi on Delphin mukana tulevan demon alkuperäinen koodi.

Laita ensin alkuperäinen koodi TTask.Run-tiedostoon, mikä tarkoittaa, että nämä koodit laitetaan säikeeseen suoritusta varten. Sen sijaan, että antaisit OnServicesDiscovered-tapahtuman alun perin nostaneen säikeen suorittaa. Mahdollinen syy: OnServicesDiscoveredin käynnistänyt säie ei voi suorittaa liian monia aikaa vieviä tehtäviä.

Koodi suoritetaan säikeessä Kun haluat kirjoittaa tietoja käyttöliittymän ohjaukseen, kuten Listbox2.Items.Add koodi, sinun on suoritettava säietynkronointi. Joten lisää TThread.Synchronize.

kehitysympäristöni

Eri ympäristöissä ilmiöt voivat olla erilaisia. Siksi tässä on kehitysympäristöni:

Delphi 11 Community Edition;

Windows 11 Home Edition;

Käännettävä ja suoritettava kohdeohjelma on Win32-versio.

Ei ole testausta, onko tässä demossa yllä olevia ongelmia Androidissa. Mutta uskon, että Androidissa on parempi lisätä TTask.Run.

Demo-ohjelman sijainti

Tässä mainittu demo, Delphin asennuksen jälkeen, jos se on asennettu oletusarvoisesti, Demo-ohjelma on:

C:KäyttäjätJulkiset asiakirjatEmbarcaderoStudio22.0SamplesObject PascalMulti-Device SamplesDevice Sensors and ServicesBluetoothBLEScanner

tiivistettynä

Delphin käyttäminen BLE-ohjelmien kehittämiseen, kuten rannerengassovelluksen tekemiseen, ei ole ongelmallista. On kuitenkin huomattava, että monissa TBluetoothLE-ohjauksen tapahtumissa on parasta olla suorittamatta liikaa koodia. Jos liiketoimintalogiikka on monimutkainen, se on parasta suorittaa erillisessä säikeessä. Tapahtumamenetelmässä aloita vain vastaava säie.

Delphille äskettäin lisätty TTask.Run antaa meille mahdollisuuden heittää paljon koodia säikeen suorittamiseen.