返回端口信息的简单代码:
private async void GetPortNames()
{
string deviceSelector = SerialDevice.GetDeviceSelector();
DeviceInformationCollection deviceCollection = await
DeviceInformation.FindAllAsync(deviceSelector);
List<string> portNamesList = new List<string>();
foreach (var item in deviceCollection)
{
SerialDevice serialDevice = await SerialDevice.FromIdAsync(item.Id);
string portName = serialDevice.PortName;
portNamesList.Add(portName);
}
}
无论出于何种原因,“等待SerialDevice.FromIdAsync(item.Id)”都不会返回SerialDevice。我已经在另一台机器上尝试过此代码(相同的VS项目/解决方案),并且工作正常。这两台计算机的配置相同(Win10 v。1809)。我还验证了软件包清单参考中的“串行通信”。
这里我还尝试了其他一些方法:我使用Microsoft.Windows.Compatibility创建了Net Standard 2.0库,并将其引用到我的UWP应用中。 UWP不允许我使用SerialPort.GetPortNames()方法。
我下载了RJCP nuget,并且可以毫无问题地使用它的GetPortNames()和GetPortDescriptions()。
最后,我可以使用RJCP进行串行通信,但是我想了解为什么Windows.Devices.SerialCommunication对我不起作用。
有什么想法吗?
**更新,也许还有潜在的提示**
筛选完有关I / O的多个SO问题之后,我在foreach中放置了一条using语句:
using (SerialDevice serialDevice = await SerialDevice.FromIdAsync(item.Id))
{
string portName = serialDevice.PortName;
AllPortNames.Add(portName);
}
这似乎一直对我有效,但是我不明白为什么。如果我的应用程序从停止状态开始执行,或者我已经重新启动PC,我应该打开任何需要Dispose()的端口吗?