Xamarin使用Plugin.BLE读取HM-19 BLE模块数据无变化该如何解决
核心问题
- 写入指令后立刻调用
ReadAsync读取,此时HM-19还未完成响应写入,读取到的是BLE特性的初始缓存值 - HM-19透传响应默认通过Notify通知推送,而非等待主动读取,官方Demo就是通过监听Notify事件获取返回值
- 直接用索引
services[0]、characteristics[0]获取服务和特性不可靠,需要通过HM-19固定UUID匹配 - 现有代码存在多处语法错误:
ButtonScan方法缺少async修饰符、变量名deviceList与devicesList混用、adapter.isScanning大小写错误(正确写法为adapter.IsScanning)
修复方案
- 使用HM-19固定UUID匹配透传服务与特性:
透传服务UUID:
0000ffe0-0000-1000-8000-00805f9b34fb
透传特性UUID:0000ffe1-0000-1000-8000-00805f9b34fb
- 开启特性的Notify监听,所有响应数据从
ValueUpdated事件中获取,无需主动调用ReadAsync - 修正现有语法错误
- 若必须使用主动读取逻辑,需要在
WriteAsync执行后添加100-200ms延迟,等待设备写入响应后再读取
修正后核心代码
public partial class BluetoothPage : ContentPage { IAdapter adapter; ObservableCollection<IDevice> devicesList; ListView pageList; // 定义HM-19固定UUID Guid hm19ServiceUuid = Guid.Parse("0000ffe0-0000-1000-8000-00805f9b34fb"); Guid hm19CharUuid = Guid.Parse("0000ffe1-0000-1000-8000-00805f9b34fb"); public BluetoothPage() { adapter = CrossBluetoothLE.Current.Adapter; devicesList = new ObservableCollection<IDevice>(); pageList = new ListView(); pageList.ItemsSource = devicesList; pageList.ItemSelected += ActionConnect; pageStackLayout.Children.Add(pageList); } // 补充async修饰符 private async void ButtonScan(object sender, EventArgs e) { try { devicesList.Clear(); adapter.DeviceDiscovered += (s, a) => { devicesList.Add(a.Device); }; if(!adapter.IsScanning) { await adapter.StartScanningForDevicesAsync(); } } catch(Exception ex) { Console.WriteLine("ERROR: " + ex.Message); } } private async void ActionConnect(object sender, SelectedItemChangedEventArgs se) { if(se.SelectedItem == null) return; try { if(adapter.IsScanning) { await adapter.StopScanningForDevicesAsync(); } var selectedDevice = (IDevice)se.SelectedItem; await adapter.ConnectToDeviceAsync(selectedDevice); // 按UUID匹配服务,不要用索引取 var service = await selectedDevice.GetServiceAsync(hm19ServiceUuid); if(service == null) { Console.WriteLine("未找到HM-19透传服务"); return; } // 按UUID匹配特性 var characteristic = await service.GetCharacteristicAsync(hm19CharUuid); if(characteristic == null) { Console.WriteLine("未找到HM-19透传特性"); return; } // 注册响应监听 characteristic.ValueUpdated += (s, e) => { // 此处获取到的就是设备返回的响应数据 byte[] response = e.Characteristic.Value; // 后续处理响应逻辑 }; // 开启Notify监听 await characteristic.StartUpdatesAsync(); // 发送指令 byte[] data = { Coderequest.InitRequest, Coderequest.Info }; await characteristic.WriteAsync(data); } catch(Exception ex) { Console.WriteLine("ERROR: " + ex.Message); } finally { pageList.SelectedItem = null; } } }
内容的提问来源于stack exchange,提问作者Cosimo Davide Viggiano
相关产品推荐
相关产品推荐

