You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 11.3编译旧项目后Bluetooth LE异常,程序冻结求助

Delphi 11.3 BLE组件Windows平台兼容问题分析与解决方向

你遇到的问题大概率是Embarcadero在Delphi 11.x版本中对Windows平台TBluetoothLE组件的封装逻辑做了变更,导致与旧版本(Delphi 10)的兼容性问题,以下是具体分析和可行的解决方向:

核心问题根源

  1. 异步操作的同步阻塞逻辑变更:Delphi 10的BLE组件在Windows平台对DiscoverServices、ReadCharacteristics这类耗时BLE操作,采用了更合理的异步回调处理;而Delphi 11.3可能修改了同步等待机制,导致主线程因等待未完成的BLE操作直接冻结,而非抛出异常。
  2. 配对强制逻辑调整:尽管BLE协议本身不强制配对,但Delphi 11.3的Windows BLE组件可能新增了配对校验逻辑,未配对时不再抛出明确异常,而是陷入阻塞状态。
  3. 特征获取的封装BUG:GetCharacteristic()返回nil、读取AService.Characteristics时冻结,说明组件在解析Windows原生BLE API返回的特征数据时出现死锁或未正确触发异步完成事件。

可行解决步骤

1. 改用异步事件替代同步调用

避免在主线程直接调用DiscoverServices、ReadCharacteristics这类方法,改用组件的异步回调事件处理:

// 初始化时绑定回调
ADevice.OnDiscoverServicesComplete := HandleServicesDiscovered;
AService.OnCharacteristicsRead := HandleCharacteristicsReady;

// 触发服务发现(非阻塞)
ADevice.DiscoverServices;

// 服务发现完成回调
procedure TMainForm.HandleServicesDiscovered(Sender: TObject; const AServiceList: TBluetoothGattServiceList);
var
  TargetService: TBluetoothGattService;
begin
  // 遍历找到目标服务
  for TargetService in AServiceList do
  begin
    if TargetService.UUID = '{你的目标服务UUID}' then
    begin
      // 触发特征读取(非阻塞)
      TargetService.ReadCharacteristics;
      Break;
    end;
  end;
end;

// 特征读取完成回调
procedure TMainForm.HandleCharacteristicsReady(Sender: TObject; const ACharacteristicList: TBluetoothGattCharacteristicList);
var
  TargetChar: TBluetoothGattCharacteristic;
begin
  // 遍历找到目标特征
  for TargetChar in ACharacteristicList do
  begin
    if TargetChar.UUID = '{你的目标特征UUID}' then
    begin
      // 处理特征数据
      Break;
    end;
  end;
end;

2. 手动处理配对状态检查

在调用BLE操作前,先检查设备配对状态,避免未配对时触发阻塞:

if not ADevice.Paired then
begin
  // 提示用户配对设备,或调用Windows原生API触发配对请求
  ShowMessage('请先配对BLE设备');
  Exit;
end;
// 再执行服务发现等操作
ADevice.DiscoverServices;

3. 绕过Delphi封装,直接调用Windows原生BLE API

如果确认是Delphi组件的BUG,可以直接调用Windows的Windows.Devices.Bluetooth相关API,实现服务和特征的获取,避免依赖FMX的TBluetoothLE组件。

4. 确认官方BUG并选择应对方案

  • 检查Embarcadero官方Quality Portal,确认是否有相同的已知问题提交;
  • 如果是官方BUG,可选择暂时降级回Delphi 10维持项目运行,或等待官方发布修复补丁。

内容的提问来源于stack exchange,提问作者László Schmidt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 20:37:37