C# - 蓝牙编程

C# - Bluetooth programming

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

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);
    }
}

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

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

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

In my program, I send a command to a device and it sends some data back.

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