Windows.Devices.SerialCommunication 命名空间

命名空间Windows.Devices.SerialCommunication定义Windows 运行时类,UWP 应用可以使用这些类与公开串行端口或串行端口的某些抽象的设备进行通信。 这些类提供发现此类串行设备、读取和写入数据的功能,以及控制流控制的特定于串行的属性,例如设置波特率、信号状态。

设备支持

串行设备将通过 属性DEVPKEY_Device_ClassGuid = {4d36e978-e325-11ce-bfc1-08002be10318}向系统公开自身,并创建具有 = DEVPKEY_DeviceInterface_ClassGuid{86e0d1e0-8089-11d0-9ce4-08003e301f73} (GUID_DEVINTERFACE_COMPORT) 的 DeviceInterface。

Windows 本机支持使用内置 usbser.sys 驱动程序 ((如 Arduino Uno R3s) 中使用的端口)由属于 USB-CDC 设备类的串行转 USB 适配器公开的端口。 USB-CDC 兼容 ID 为:

  • USB\Class_02&SubClass_02&Prot_01
  • USB\Class_02&SubClass_02

其他串行转 USB 适配器 ((如 FTDI/Prolific/Silicon-Labs) )也支持公开 GUID_DEVINTERFACE_COMPORT,但需要其他特定于供应商的驱动程序。

除非供应商驱动程序明确标记为不受限制 DEVPKEY_DeviceInterface_Restricted == TRUE (DEVPKEY_Device_InLocalMachineContainer == TRUE) ,否则无法访问标记为计算机内部 () 的串行端口。 因此,无法通过大多数 PCI COM 端口扩展卡连接设备。

不可访问的串行端口仍可由 DeviceInformation.FindAllAsync () 枚举,但无法由 SerialDevice.FromIdAsync () 打开。 尝试打开此类设备将引发异常或返回 null。 应用应通过从用户视图中筛选此类串行端口来处理这种情况,以便用户无法与此类不受支持的串行端口交互。

DeviceInformation.FindAllAsync () 返回的 DeviceInformation 集合可能有一个串行设备,其 DeviceInformation.Name 属性设置为计算机名称。 这是设计使然,在枚举载入串行端口时可能发生。 应用应通过以下方式处理这种情况:

  • 从用户视图中筛选此类串行端口,使用户根本无法与此类不受支持的串行端口交互。
  • 如果应用决定允许用户与此类串行端口交互,请注意,当应用调用 DeviceAccessInformation.CreateFromId () 函数时,会出现异常,并显示以下消息:“系统找不到指定的文件。 (HRESULT 异常:0x80070002) “将引发。 应用应处理此类异常,并告知用户端口不受支持。

始终可以通过编写自定义驱动程序和匹配的硬件支持应用来替代可访问性/功能策略

串行设备功能

UWP 应用必须在其应用包清单中包含某些设备功能。 这些功能标识设备及其用途。 下面是按层次结构顺序排列的必需元素:

自 Windows 10 版本 1809 (2018 年 10 月更新)

自 1809 年以来,不再需要指定 vidpid 和 function-type,并将在这些系统上被忽略。 如果面向 1809 之前的系统,请参阅下文。

<DeviceCapability Name="serialcommunication"/>

在 2018 年 10 月 Windows 10 版本 1809 (之前更新)

  • <DeviceCapability>Name 属性必须为 serialcommunication

    • <设备>Id 属性必须指定设备标识符。 如果使用串行转 USB 适配器, ID 必须指定供应商/产品标识符,也可以是“任意”,以允许访问与函数类型匹配的任何设备。

      • <函数>Type 属性指定设备函数。 对于串行设备,此必须为 serialPort
<DeviceCapability Name="serialcommunication">
    <Device Id="vidpid:xxxx xxxx">
      <Function Type="name:serialPort"/>
    </Device>
</DeviceCapability>

串行设备功能示例

下面是定义串行设备功能的示例。 它允许应用通过串行转 USB 适配器访问串行端口。

<DeviceCapability Name="serialcommunication">
  <Device Id="vidpid:045E 0610">
    <Function Type="name:serialPort"/>
  </Device>
</DeviceCapability>

疑难解答

  • 验证应用程序清单中 (serialcommunication) 的串行功能。
  • 验证用户是否已授予应用程序使用串行设备的权限。
  • () DEVPKEY_Device_InLocalMachineContainer == TRUE 的计算机内部设备通常 无法访问 。 (例如 PCI COM 端口扩展卡)
    • 除非 的设备接口属性DEVPKEY_DeviceInterface_RestrictedGUID_DEVINTERFACE_COMPORT设置为 FALSE,否则无法访问内部设备。 某些驱动程序(尤其是 IoT SKU 上的驱动程序)可能会将此属性设置为 FALSE
    • 如果访问基于 SerCx Windows 10 1903 (SerCx2 2019 年 5 月更新) 则设备可以选择直接从用户模式启用 RhProxy进行访问。
  • 通过与驱动程序开发人员合作创建硬件支持应用来创建自定义设备时,可以绕过这些限制

ErrorReceivedEventArgs

表示作为参数传递给在串行端口上发生错误时调用的事件处理程序的对象。

PinChangedEventArgs

表示作为参数传递给事件处理程序的对象,当串行端口上的信号线状态更改时调用该事件处理程序。

SerialDevice

表示串行端口。 对象提供方法和属性,应用可以使用这些方法和属性来查找系统上的串行端口并与之交互。

枚举

SerialError

定义串行端口上可能发生的错误条件的值。

SerialHandshake

定义串行通信中使用的硬件和软件流控制协议的值。 这些值由 SerialDevice 对象上的 Handshake 属性使用。

SerialParity

定义串行数据传输的奇偶校验位的值。 这些值由 SerialDevice 对象上的奇偶校验属性使用。

SerialPinChange

定义串行端口上信号状态更改类型的值。

SerialStopBitCount

定义指示传输中使用的停止位数的值。 这些值由 SerialDevice 对象上的 StopBits 属性使用。

另请参阅