这是我正在编写的UWP应用程序的一个片段
// [...]
using Windows.Devices.Enumeration;
using Windows.Devices.SerialCommunication;
using Windows.Networking.Connectivity;
// [...]
private Dictionary<string, SerialDevice> _SerialDevices = new Dictionary<string, SerialDevice>();
// [...]
var serialSelector = SerialDevice.GetDeviceSelector();
var serialDevices = (await DeviceInformation.FindAllAsync(serialSelector)).ToList();
var hostNames = NetworkInformation.GetHostNames().Select(hostName => hostName.DisplayName.ToUpper()).ToList(); // So we can ignore inbuilt ports
foreach (var deviceInfo in serialDevices)
{
if (hostNames.FirstOrDefault(hostName => hostName.StartsWith(deviceInfo.Name.ToUpper())) == null)
{
try
{
var serialDevice = await SerialDevice.FromIdAsync(deviceInfo.Id);
if (serialDevice != null)
{
_SerialDevices.Add(deviceInfo.Id, serialDevice);
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.ToString());
}
}
}
我已将以下内容添加到项目的Package.appxmanifest文件中
<DeviceCapability Name="serialcommunication">
<Device Id="any">
<Function Type="name:serialPort" />
</Device>
</DeviceCapability>
当我到达var serialDevice = await SerialDevice.FromIdAsync(deviceInfo.Id);
行时,它会抛出异常:
{System.Exception:信号量超时期限已过期。 (HRESULT的例外情况:0x80070079)
在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
在TorinoBluetooth.UwpHidConnector.d__9.MoveNext()}
为什么这会失败?UWP是否存在以这种方式阻止串行连接的问题?
(注意我知道串口连接正常,因为我可以在设备管理器中查找它,它被列为“标准串行蓝牙链接(COM8)”,然后手动将其他代码连接到“COM8” 。)
答案 0 :(得分:0)
此错误大大降低了串行端口枚举过程的速度,并且在迭代串行设备时可能会发生多次。这是运行代码的计算机所特有的串行端口问题。要解决问题机器上的问题,请检查在处理程序中引发错误的每个deviceInfo.Id。例如,具有“ \?\ BTHENUM#{...}”之类的ID的设备会立即告诉您这是导致超时的Bluetooth VSP。您可以在“设置/打印机和扫描仪”下删除不再使用的蓝牙打印机以将其清除。否则,该ID应该为您提供线索,以在“设备管理器”中跟踪问题串行驱动程序,您可以将其删除或更新。