我正在與自定義外部設備通信,并且該設備需要在我發送資料時,我必須在 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 毫秒,并且想要再次發送資料。是否有任何解決方法可以解決此問題?
uj5u.com熱心網友回復:
寫入操作之間長時間延遲的原因之一可能是 writeType。有兩種型別,writeWithResponse和writeWithoutResponse。第一種是更安全的方法,因為如果您的訊息發送正確,您將收到確認。這顯然限制了資料吞吐量。
將 writeType 設定為 writeWithoutResponse 可能適用于您的情況。github上的這個問題顯示了正確的方法:
Characteristics.WriteType = Plugin.BLE.Abstractions.CharacteristicWriteType.WithoutResponse;
uj5u.com熱心網友回復:
我看到兩個可以改進的問題:
- 正如 JonasH 在評論中提到的,不要一起使用
async/await和ContinueWith。await足以暫停您的代碼,直到異步任務完成。 - 重新使用通信的“設定”,以便只需要進行兩次最終呼叫。
我不熟悉那個插件(剛剛查看了它的檔案,以確認基本方法),因此此代碼可能需要進行一些調整,但希望這將是一個起點:
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);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/361149.html
標籤:C# 沙马林 xamarin.forms 低功耗蓝牙
上一篇:對oAuth2Keycloak服務器的HTTPS請求在Xamarin中回傳400“錯誤請求”
下一篇:Xamarin自定義控制元件
