我想在Xamarin Forms应用程序中打开连接的蓝牙设备上的串行端口。
这是代码(为了说明问题,我对其进行了简化):
string l_gdsSelector = SerialDevice.GetDeviceSelector();
var l_ardiDevices = await DeviceInformation.FindAllAsync(l_gdsSelector);
foreach(DeviceInformation l_diCurrent in l_ardiDevices)
{
if(l_diCurrent.Name.StartsWith("PX05"))
{
m_sdDevice = await SerialDevice.FromIdAsync(l_diCurrent.Id);
break;
}
}
这段代码抛出“找不到元素”(HRESULT的异常:0x80070490)
await SerialDevice.FromIdAsync
处的异常我不敢相信:“找不到元素”,而DeviceInformation.FindAllAsync只是将其作为现有设备返回了!
有人可以向我解释这种奇怪的行为吗?并且主要是如何解决呢?
先感谢您
最佳答案
必须在UI线程中首次调用DeviceInformation.FindAllAsync函数。由于此代码是DLL的一部分,因此我决定始终在UI线程中调用它。
所以这是我修改的代码:
TaskCompletionSource<bool> l_tcsResult = new TaskCompletionSource<bool>();
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
{
try
{
m_sdDevice = await SerialDevice.FromIdAsync(p_strDeviceID);
l_tcsResult.SetResult(true);
}
catch (Exception l_exError)
{
l_tcsResult.SetException(l_exError);
System.Diagnostics.Debug.WriteLine(l_exError);
}
});
await l_tcsResult.Task;
要允许应用程序与串行设备通信,请编辑包清单并在部分中添加以下条目:
<DeviceCapability Name="serialcommunication">
<Device Id="any">
<Function Type="name:serialPort" />
</Device>
</DeviceCapability>