【问题标题】:C# - Bluetooth programmingC# - 蓝牙编程
【发布时间】:2016-05-05 21:22:59
【问题描述】:

在我的程序中,我向设备发送一个命令,然后它会发回一些数据。只要数据可用,就会调用以下事件处理程序。

private void notify_change(GattCharacteristic sender, GattValueChangedEventArgs args)
{
    lock (this._dataRec)
    {
        notCounter++;
        byte[] bArray = new byte[args.CharacteristicValue.Length];
                DataReader.FromBuffer(args.CharacteristicValue).ReadBytes(bArray);                
                dataQ.Enqueue(Encoding.ASCII.GetString(bArray));
                Monitor.Pulse(this._dataRec);
    }
}

有时,我注意到在读取之前的数据之前调用了它(或类似的东西;从命令列表中,数据似乎丢失了)。看起来每当调用函数时缓冲区都会被覆盖。有没有办法将数据添加到缓冲区而不是覆盖它?

【问题讨论】:

    标签: c# bluetooth win-universal-app gatt


    【解决方案1】:

    在我的程序中,我向设备发送命令并发送一些数据 返回。

    由于您是通过调用触发响应,因此请确保您不会在设备端造成缓冲区溢出。两个数据包之间的最小理论间隔为 7.5 毫秒,但实际上约为 20-30 毫秒。因此,如果您在循环中发送,如果间隙小于您的硬件设置可以处理的范围,您的设备将丢失(覆盖)数据包。

    【讨论】:

      【解决方案2】:

      GATT 协议有两个选项来接收不请自来的信息。它们是通知和指示。通知是一种没有接收方确认的通知,而指示需要接收方确认。所以您可能需要指示,如果这不是一个选项,您需要确保在下一次通知之前复制数据。

      请参阅蓝牙规范中的以下内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-20
        • 2012-06-13
        • 2011-02-02
        • 2012-07-09
        • 2012-06-12
        • 2014-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多