SerialDevice.FromIdAsync(字符串id)超时

时间:2017-06-01 11:26:03

标签: bluetooth uwp serial-port

这是我正在编写的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” 。)

1 个答案:

答案 0 :(得分:0)

此错误大大降低了串行端口枚举过程的速度,并且在迭代串行设备时可能会发生多次。这是运行代码的计算机所特有的串行端口问题。要解决问题机器上的问题,请检查在处理程序中引发错误的每个deviceInfo.Id。例如,具有“ \?\ BTHENUM#{...}”之类的ID的设备会立即告诉您这是导致超时的Bluetooth VSP。您可以在“设置/打印机和扫描仪”下删除不再使用的蓝牙打印机以将其清除。否则,该ID应该为您提供线索,以在“设备管理器”中跟踪问题串行驱动程序,您可以将其删除或更新。