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

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)

修复方案

  1. 使用HM-19固定UUID匹配透传服务与特性:

透传服务UUID:0000ffe0-0000-1000-8000-00805f9b34fb
透传特性UUID:0000ffe1-0000-1000-8000-00805f9b34fb

  1. 开启特性的Notify监听,所有响应数据从ValueUpdated事件中获取,无需主动调用ReadAsync
  2. 修正现有语法错误
  3. 若必须使用主动读取逻辑,需要在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:18:00