【问题标题】:How to get available serial ports in UWP?如何在 UWP 中获取可用的串口?
【发布时间】:2018-01-29 05:48:47
【问题描述】:

我正在寻找可以在 UWP 应用程序中获取串行端口列表的 API。 由于 System.IO.Ports 不适用于 UWP,您能否建议以下代码的任何替代方案。

string[] ports = SerialPort.GetPortNames();

【问题讨论】:

标签: c# uwp window


【解决方案1】:

首先在您的 ptoject 中的 Package.appxmanifest 中添加此项目,然后右键单击 Package.appxmanifest 并在 Capabilities 标签中选择 View Code

 <DeviceCapability Name="serialCommunication">
  <Device Id="any">
    <Function Type="name:serialPort" />
  </Device>
</DeviceCapability>

然后将所有串行设备连接到您的电脑并检查 PortName

string aqs = SerialDevice.GetDeviceSelector();
var deviceCollection = await DeviceInformation.FindAllAsync(aqs);
List<string> portNamesList = new List<string>();
foreach (var item in deviceCollection)
{
     var serialDevice = await SerialDevice.FromIdAsync(item.Id);
     var portName = serialDevice.PortName;
     portNamesList.Add(portName);
}

【讨论】:

  • 谢谢,我收到“信号量超时期限已过。 (来自 HRESULT 的异常:0x80070079)在调用 SerialDevice.FromIdAsync(item.Id) 时执行,还在应用清单中添加了功能。
  • 在使用您的代码时,“错误 HRESULT E_FAIL 已从对 COM 组件的调用中返回。” Stack Strace Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(String aqsFilter) 这个异常在一次又一次调用 FindAllAsync 方法时发生 2-3 次,经过几次试验,我得到了可用端口的列表。第一次执行 FindAllAsync 方法时如何解决此问题以获取端口列表?
  • @Dishant 您是否对错误有任何解决方案 - '信号量超时期限已过。 (来自 HRESULT 的异常:0x80070079)' ??为了获取 COM 端口名称列表,我使用了这段代码,但我遇到了这个错误。请给出您的建议,您是如何解决此错误的?或者您曾使用的任何替代解决方案并成功地没有错误地工作?
  • @xyzWty, Dishant:此错误会大大减慢枚举过程,并且可能会发生多次。这是运行代码的机器的特定端口问题。要解决此问题,请添加错误处理程序并检查引发错误的 item.ID。例如,ID 为“\\?\BTHENUM#{...}”的设备会立即告诉您它是导致超时的蓝牙 VSP。您可以在设置/打印机和扫描仪下删除不再使用的蓝牙打印机以清除它。否则,该 ID 应该会为您提供在设备管理器中查找问题串行驱动程序的线索。
  • 上述方法不适用于所有设备。就我而言,我正在尝试枚举 Panasonic FZ-M1 Toughbook 上的 COM 端口。即使 port.ID 指向注册表中的正确条目,“await SerialDevice.FromIdAsync (ID)”也会返回 null。而是返回 port.Name = "DESKTOP-QR####" 而不是 "COM##"。可能是松下的架构问题,但这种方法仍然失败。
【解决方案2】:

@Parsa Karami 提供的代码的补充:

如果您在执行代码后尝试打开串口,则会抛出 System.IO.IOException。所以,我建议你在获取端口名称后添加 Dispose() 调用。

string aqs = SerialDevice.GetDeviceSelector();
var deviceCollection = await DeviceInformation.FindAllAsync(aqs);
List<string> portNamesList = new List<string>();
foreach (var result in deviceCollection)
{
    var serialDevice = await SerialDevice.FromIdAsync(result.Id);
    var portName = serialDevice.PortName;
    serialDevice.Dispose(); // Addition
    portNamesList.Add(portName);
}

【讨论】:

    猜你喜欢
    • 2010-11-26
    • 2016-11-28
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    相关资源
    最近更新 更多