C# 如何在UWP中获得可用的串行端口?

C# 如何在UWP中获得可用的串行端口?,c#,uwp,window,C#,Uwp,Window,我正在寻找API,可以得到在UWP应用程序的串行端口列表。 由于System.IO.Ports不适用于UWP,您能否建议以下代码的任何替代方案 string[] ports = SerialPort.GetPortNames(); 首先将此项添加到pObject中的Package.appxmanifest中,要执行此操作,请右键单击Package.appxmanifest并在功能标签中选择查看代码: <DeviceCapability Name="serialCommunication

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

string[] ports = SerialPort.GetPortNames();

首先将此项添加到pObject中的Package.appxmanifest中,要执行此操作,请右键单击Package.appxmanifest并在功能标签中选择查看代码:

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

之后,将所有串行设备连接到电脑,并检查端口名

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);
}
string aqs=SerialDevice.GetDeviceSelector();
var deviceCollection=等待设备信息。FindAllAsync(aqs);
List portNamesList=新列表();
foreach(deviceCollection中的var项)
{
var serialDevice=await serialDevice.FromIdAsync(item.Id);
var portName=serialDevice.portName;
portNamesList.Add(portName);
}

对@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);
}
string aqs=SerialDevice.GetDeviceSelector();
var deviceCollection=等待设备信息。FindAllAsync(aqs);
List portNamesList=新列表();
foreach(deviceCollection中的var结果)
{
var serialDevice=await serialDevice.FromIdAsync(result.Id);
var portName=serialDevice.portName;
serialDevice.Dispose();//添加
portNamesList.Add(portName);
}

您在github上查看过这个问题吗?似乎他们还没有实现它。谢谢,我得到的信号灯超时时间已经过了。调用SerialDevice.FromIdAsync(item.Id)时执行(HRESULT:0x80070079的异常)选项,还添加了应用程序清单中的功能。在使用代码时,“调用COM组件时返回错误HRESULT E_FAIL。”堆栈策略Windows.Devices.Enumeration.DeviceInformation.Findalsync(字符串aqsFilter)在反复调用FindAllAsync方法时,此异常会发生2-3次,经过几次尝试后,我得到了可用端口的列表。如何解决此问题以在第一次执行FindAllAsync方法时获取端口列表?@Dishant您是否有关于错误的解决方案-'信号量超时时间已过期。(HRESULT:0x80070079的例外情况)“??为了得到COM端口名的列表,我使用了这段代码,我面临这个错误。请给出您的建议,您是如何解决此错误的?或者您曾经为之工作并成功工作而没有出现错误的任何替代解决方案?@xyzWty,Dishant:此错误会大大降低枚举过程的速度,并且可能会发生多次。这是运行代码的机器的端口特定问题。要解决此问题,请添加错误处理程序并检查引发错误的item.id。例如,一个ID为“\\?\BTHENUM{…}”的设备会立即告诉您是蓝牙VSP导致超时。您可以在“设置/打印机和扫描仪”下删除不再使用的蓝牙打印机以将其清除。否则,ID将为您提供线索,以便在设备管理器中查找有问题的串行驱动程序。上述方法不适用于所有设备。在我的例子中,我试图列举松下FZ-M1 Toughbook上的COM端口。“await SerialDevice.FromIdAsync(ID)”返回null,即使port.ID指向注册表中的正确条目。而是返回port.Name=“DESKTOP-QR#####”而不是“COM”。可能是松下的架构问题,但这种方法仍然失败。