2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
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.
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.
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:
- procedure TForm6.BluetoothLE1ServicesDiscovered(const Sender: TObject; const AServiceList: TBluetoothGattServiceList);
- var
- ServiceIndex: Integer;
- Service: TBluetoothGattService;
- CharacteristicIndex: Integer;
- Characteristic: TBluetoothGattCharacteristic;
- begin
- //以下代码如果不包到 TTask.Run 里面(原本的代码没有),在 WINDOWS 底下,执行到 for
- //CharacteristicIndex := 0 to Service.Characteristics.Count 会界面冻结,而且单步跟踪也停止
- //了,没有往下执行。
- TTask.Run(
- procedure
- var
- ServiceIndex: Integer;
- CharacteristicIndex: Integer;
- begin
- if AServiceList.Count > 0 then
- begin
- for ServiceIndex := 0 to AServiceList.Count - 1 do
- begin
- Service := AServiceList[ServiceIndex];
-
- TThread.Synchronize(nil,
- procedure
- begin
- Listbox2.Items.Add((ServiceIndex + 1).ToString + ' - ' + Service.UUIDName + ' - ' + Service.UUID.ToString);
- end
- );
-
-
- //以下代码会导致死机,如果断点跟踪,直接就是停在 for 这一行,不会继续往下执行。
- for CharacteristicIndex := 0 to Service.Characteristics.Count - 1 do
- begin
- Characteristic := Service.Characteristics[CharacteristicIndex];
-
- TThread.Synchronize(nil,
- procedure
- begin
- Listbox2.Items.Add(' - ' + Characteristic.UUIDName + ' - ' + Characteristic.UUID.ToString);
- end
- );
-
- end;
-
- end;
- end
- else
- TThread.Synchronize(nil,
- procedure
- begin
- Listbox2.Items.Add('- Access not allowed or no service available');
- end
- );
-
- end
- );
-
- //Listbox1.Enabled := True;
- end;
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.
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
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.