Я хотел написать программу, которая получает данные каждые 10 мс через Bluetooth Low Energy.
У меня много дел, но у меня всегда есть одна проблема, и я не могу найти источник.
Вот основа моего кода, написанного на C ++ Builder 10 для Windows 10.
> //---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"//---------------------------------------------------------------------------
#pragma package(smart_init)
#define Characteristic_UUID "{6e400003-b5a3-f393-e0a9-e50e24dcca9e}"#define Service_UUID "{6e400001-b5a3-f393-e0a9-e50e24dcca9e}"#pragma resource "*.dfm"TForm1 *Form1;
TBluetoothLEDevice* device;
TBluetoothGattCharacteristicList* characteristic ;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
BluetoothLE1->DiscoverDevices(100);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BluetoothLE1EndDiscoverDevices(TObject * const Sender, TBluetoothLEDeviceList * const ADeviceList)
{
device = ADeviceList->First();
BluetoothLE1->DiscoverServices(device);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BluetoothLE1ServicesDiscovered(TObject * const Sender, TBluetoothGattServiceList * const AServiceList)
{
GUID AGuid;
CLSIDFromString(TEXT(Service_UUID), &AGuid);
TBluetoothGattService* service = BluetoothLE1->GetService(device,AGuid);
//TBluetoothGattServiceList* abcd = BluetoothLE1->GetServices(device);CLSIDFromString(TEXT(Characteristic_UUID), &AGuid);
characteristic = BluetoothLE1->GetCharacteristics(service);
while(characteristic->First()->UUID != AGuid)
{
characteristic->Delete(0);
}
if(characteristic->First()!= NULL);
BluetoothLE1->SubscribeToCharacteristic(device,characteristic->First());
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BluetoothLE1CharacteristicRead(TObject * const Sender, TBluetoothGattCharacteristic * const ACharacteristic,
TBluetoothGattStatus AGattStatus)
{
static long i;
Label1->Caption = i;
i++;
}
//---------------------------------------------------------------------------
После 86303 уведомлений (вызывая BluetoothLE1CharacteristicRead) я получаю переполнение стека. Так что должно быть что-то не так.
В начале я написал программу в Visual Studio на C ++ с функциями драйверов Windows, но то же самое.
Я нашел проблему.
Это ошибка в Win32 Bluetooth API.
При обновлении Windows KB3156421 каждая программа падает после одного уведомления, и Mircosoft предлагает обходной путь. Ссылка на сайт
Этот обходной путь исправляет и мою проблему выше.
Других решений пока нет …