UWP无法连接到虚拟串行端口

时间:2018-02-08 17:27:41

标签: c# uwp win-universal-app windows-10-universal com0com

我有时无法访问我正在编程的硬件,或者只是调试不好。 所以这就是为什么我想让我的生活更轻松,并使用虚拟串口。

我选择使用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无法使用虚拟端口吗?

2 个答案:

答案 0 :(得分:3)

  

我的问题是我的UWP应用确实找到了端口但无法连接到它。   目前,UWP不支持没有VIDPID参数的虚拟串行端口。

对于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对串口的访问权限有限。

SerialCommunication

  

SystemInformation.FindAllAsync()可以枚举系统内部或机箱上串行端口,但SerialDevice.FromIdAsync()无法打开它们,因为它们当前不受支持。但是,支持通过USB连接的串行端口,例如USB-to-Serial电缆。

     

DeviceInformation.FindAllAsync()返回的DeviceInformation集合可能有一个串行设备,其DeviceInformation.Name属性设置为计算机名称。这是设计使然,可能在枚举板载串行端口时发生