0

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

我选择使用 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端口。

当我调试我的代码时,我可以看到该端口已找到并加载到“设备 [0]”中,但是当我运行该FromIdAsync方法时它没有加载到“设备”中。

我做错了什么还是 UWP 不适用于虚拟端口?

4

2 回答 2

3

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

对于 UWP,它对串行端口文件的访问非常有限。它DeviceIdAppxManifestType.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应用程序中访问串口的限制较少,可以直接连接到可视串口。

于 2018-02-09T07:44:21.070 回答
1

可能这与您询问虚拟端口的问题没有直接关系,它对UWP中的串口问题有所启发。正如@Nico Zhu 所说,UWP 对串行端口的访问受到限制。

串行通讯

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

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

于 2018-04-05T11:39:19.797 回答