我有时无法访问我正在编程的硬件,或者只是调试不好。 所以这就是为什么我想让我的生活更轻松,并使用虚拟串口。
我选择使用com0com,因为它很容易设置,而且它是免费的。
我的问题是我的UWP应用确实找到了端口但无法连接到它。
我正在使用的代码是:
public async Task<string> Init()
{
try
{
if (_serialPort == null)
{
var aqs = SerialDevice.GetDeviceSelector("COM7");
var devices = await DeviceInformation.FindAllAsync(aqs, null);
if (devices.Any())
{
await OpenPort(devices[0].Id);
return "found port";
}
}
else
{
return "port already configured";
}
return "whatever";
}
catch (Exception ex)
{
return ex.Message;
}
}
private async Task OpenPort(string deviceId)
{
try
{
_serialPort = await SerialDevice.FromIdAsync(deviceId);
if (_serialPort != null)
{
_serialPort.WriteTimeout = TimeSpan.FromMilliseconds(1000);
_serialPort.ReadTimeout = TimeSpan.FromMilliseconds(1000);
_serialPort.BaudRate = 19200;
_serialPort.Parity = SerialParity.None;
_serialPort.StopBits = SerialStopBitCount.One;
_serialPort.DataBits = 8;
_serialPort.Handshake = SerialHandshake.None;
}
}
catch (Exception ex)
{
throw ex;
}
}
我知道代码本身正在工作,因为我使用硬件就像这样。我唯一改变的是我直接搜索COM7端口。
当我调试我的代码时,我可以看到端口被找到并加载到“device [0]”
但是当我运行FromIdAsync
方法时,它不会加载到“设备”中。
我做错了什么或者UWP无法使用虚拟端口吗?
答案 0 :(得分:3)
我的问题是我的UWP应用确实找到了端口但无法连接到它。 目前,UWP不支持没有
VID
和PID
参数的虚拟串行端口。
对于UWP,它对文件串口的访问非常有限。它在DeviceId
中定义了特定的AppxManifestType.xsd
方案。当您调用SerialDevice.FromIdAsync()
方法时,如果您的设备ID不匹配,它将与以下方案匹配。该方法不会返回SerialDevice
。因此,UWP目前不支持可视串口。
<xs:simpleType name="ST_DeviceId">
<xs:restriction base="ST_NonEmptyString">
<xs:pattern value="any"/>
<xs:pattern value="vidpid:[0-9a-fA-F]{4} [0-9a-fA-F]{4}( (usb|bluetooth))?"/>
<xs:pattern value="model:[^;]{1,512};.{1,512}"/>
</xs:restriction>
</xs:simpleType>
在Win32应用程序中访问串行端口的限制较少,您可以直接连接到可视串行端口,有关详细信息,请参阅此blog。
答案 1 :(得分:0)
可能这与您要求虚拟端口的问题没有直接关系,它对UWP中的串口问题给出了一点启示。正如@Nico Zhu所说,UWP对串口的访问权限有限。
SystemInformation.FindAllAsync()可以枚举系统内部或机箱上串行端口,但SerialDevice.FromIdAsync()无法打开它们,因为它们当前不受支持。但是,支持通过USB连接的串行端口,例如USB-to-Serial电缆。
DeviceInformation.FindAllAsync()返回的DeviceInformation集合可能有一个串行设备,其DeviceInformation.Name属性设置为计算机名称。这是设计使然,可能在枚举板载串行端口时发生