【问题标题】:WriteCharacteristics send data faster twiceWriteCharacteristics 两次发送数据的速度更快
【发布时间】:2023-03-22 04:16:01
【问题描述】:

我正在与自定义外部设备通信,并且此设备要求当我发送数据时,我必须在 10 到 100 毫秒之间再次发送相同的数据(以 10-100 毫秒的间隔发送两次数据) .

基本上发送数据效果很好,但是第二次发送在500-800毫秒之间,所以我必须减少它。

我使用Plugin.BLE

...
public async Task WriteCharacteristics(byte value)
        {
            try
            {
                byte[] data = {value};
                await Service.GetCharacteristicsAsync().ContinueWith(async task =>
                {
                    Characteristics = task.Result;

                    await Characteristics.First().WriteAsync(data).ContinueWith(async t1 =>
                    {
                        await Characteristics.First().StartUpdatesAsync();
                    });
                });
            }
            catch (Exception e)
            {
                Debug.WriteLine("********* Failed to get ReadCharacteristics: " + e.Message);
            }
        }
...

当我打电话时:

...
 _ = ble.WriteCharacteristics((byte)value).ContinueWith(_ =>
     {
          Thread.Sleep(10);
          ble.WriteCharacteristics((byte)value).Wait();
     });
...

我尝试以并行方式调用该函数两次,但该解决方案并不好。

正如您在我调用时看到的那样,它等待了 10 毫秒,并且想要再次发送数据。有什么办法可以解决这个问题吗?

【问题讨论】:

  • 提示:最好不要混合异步和线程。使用await Task.Delay(10) 而不是Thread.Sleep(10)
  • 我也试过了,不睡觉也试过了,但第二次发送总是在 500 到 800 毫秒之间。
  • 你为什么同时使用awaitContinueWith?真正的失败是什么?您是否对检查两次WriteCharacteristics 调用之间的延迟的方法进行了计时?
  • 我也试过没有继续。我在设备中计时以检查延迟,在设备中我看到 writeCharacteristics 成功,但在 500 - 800 毫秒之间。所以发送总是成功,而不是失败,但是我从移动设备通信的设备需要在 10 - 100 毫秒之间再次发送相同的数据
  • 您的设备概念似乎有问题。绝不应该这样,您需要发送两次数据。最好在 PC 端运行数据广告,设备会在需要时捕获广告并从中获取数据。不,你不能在 Windows 上创建这种依赖时间的应用程序,因为 Windows 不是实时操作系统。

标签: c# xamarin xamarin.forms bluetooth-lowenergy


【解决方案1】:

写入操作之间的长时间延迟的一个原因可能是 writeType。有两种类型,writeWithResponsewriteWithoutResponse。第一种是更安全的方法,因为如果您的消息发送正确,您将收到确认。这显然限制了数据吞吐量。

将 writeType 设置为 writeWithoutResponse 可能适用于您的情况。 github上的这个issue显示了正确的方法:

Characteristics.WriteType = Plugin.BLE.Abstractions.CharacteristicWriteType.WithoutResponse;

【讨论】:

  • 谢谢你的解决方案,但遗憾的是结果是一样的。 Te 设备在 500 到 800 秒之间接收数据
【解决方案2】:

我看到两个可以改进的问题:

  1. 正如 JonasH 在评论中提到的,不要同时使用 async/awaitContinueWithawait 足以暂停您的代码,直到异步任务完成。
  2. 重新使用通信的“设置”,因此只需要进行两次最终调用。

我不熟悉那个插件(刚刚查看了它的文档,以确认基本方法),所以这段代码可能需要一些调整,但希望这将是一个起点:

public async Task WriteByteTwice(byte value)
    {
        try
        {
            // Plug-in docs say WriteAsync call should be on MAIN THREAD.
            if (!Xamarin.Essentials.MainThread.IsMainThread)
                throw new InvalidProgramException("WriteByteTwice must be called from MainThread");

            byte[] data = {value};
            Characteristics = await Service.GetCharacteristicsAsync();
            
            // Send data first time.
            await Characteristics.First().WriteAsync(data);
            await Characteristics.First().StartUpdatesAsync();

            await Task.Delay(10);
            
            // Send data again.
            await Characteristics.First().WriteAsync(data);
            await Characteristics.First().StartUpdatesAsync();
            
        }
        catch (Exception e)
        {
            Debug.WriteLine("********* Failed to get ReadCharacteristics: " + e.Message);
        }
    }

【讨论】:

    猜你喜欢
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 2012-05-23
    • 1970-01-01
    相关资源
    最近更新 更多