Windows.Devices.SerialCommunication 네임스페이스

Windows.Devices.SerialCommunication 네임스페이스는 UWP 앱이 직렬 포트 또는 직렬 포트의 일부 추상화 또는 직렬 포트를 노출하는 디바이스와 통신하는 데 사용할 수 있는 Windows 런타임 클래스를 정의합니다. 클래스는 이러한 직렬 디바이스를 검색하고, 데이터를 읽고 쓰고, 흐름 제어에 대한 직렬별 속성(예: 전송 속도, 신호 상태 설정)을 제어하는 기능을 제공합니다.

디바이스 지원

직렬 디바이스는 속성DEVPKEY_Device_ClassGuid{4d36e978-e325-11ce-bfc1-08002be10318} = 으로 시스템에 자신을 노출하고 (GUID_DEVINTERFACE_COMPORT)를 사용하여 DeviceInterface DEVPKEY_DeviceInterface_ClassGuid = {86e0d1e0-8089-11d0-9ce4-08003e301f73} 를 만듭니다.

Windows는 기본적으로 받은 편지함 usbser.sys 드라이버(예: Arduino Uno R3s에서 사용되는 드라이버)를 사용하여 USB-CDC 디바이스 클래스에 속하는 직렬-USB 어댑터에서 노출되는 포트를 지원합니다. USB-CDC 호환 ID는 다음과 같습니다.

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

를 노출 GUID_DEVINTERFACE_COMPORT하는 다른 직렬-USB 어댑터(예: FTDI/Prolific/Silicon-Labs)도 지원되지만 추가 공급업체별 드라이버가 필요합니다.

공급업체 드라이버가 무제한()으로 명시적으로 표시하지 않는 한 컴퓨터 내부DEVPKEY_Device_InLocalMachineContainer == TRUE로 표시된 직렬 포트(DEVPKEY_DeviceInterface_Restricted == TRUE)는 액세스할 수 없습니다. 따라서 대부분의 PCI COM 포트 확장 카드를 통해 연결하는 디바이스는 액세스할 수 없습니다 .

액세스할 수 없는 직렬 포트는 DeviceInformation.FindAllAsync()에서 열거할 수 있지만 SerialDevice.FromIdAsync()에서 열 수 없습니다. 이러한 디바이스를 열면 예외가 throw되거나 null이 반환됩니다. 앱은 사용자가 지원되지 않는 직렬 포트와 상호 작용할 수 없도록 사용자 보기에서 이러한 직렬 포트를 필터링하여 이 사례를 처리해야 합니다.

DeviceInformation.FindAllAsync()에서 반환된 DeviceInformation 컬렉션에 DeviceInformation.Name 속성이 컴퓨터 이름으로 설정된 직렬 디바이스가 있을 수 있습니다. 이는 의도적으로 수행되며 온보드 직렬 포트를 열거할 때 발생할 수 있습니다. 앱은 다음 중 하나를 통해 이 사례를 처리해야 합니다.

  • 사용자가 지원되지 않는 직렬 포트와 전혀 상호 작용할 수 없도록 사용자 보기에서 이러한 직렬 포트를 필터링합니다.
  • 앱이 사용자가 이러한 직렬 포트와 상호 작용하도록 하기로 결정한 경우 앱이 DeviceAccessInformation.CreateFromId() 함수를 호출할 때 다음과 같은 메시지와 함께 예외가 발생합니다. "시스템에서 지정된 파일을 찾을 수 없습니다. (HRESULT: 0x80070002 예외)"가 throw됩니다. 앱은 이러한 예외를 처리하고 포트가 지원되지 않는다는 것을 사용자에게 알려야 합니다.

사용자 지정 드라이버를 작성하고 하드웨어 지원 앱을 일치시켜 접근성/기능 정책을 항상 재정의할 수 있습니다.

직렬 디바이스 기능

UWP 앱은 앱 패키지 매니페스트에 특정 디바이스 기능을 포함해야 합니다. 기능은 디바이스 및 해당 용도를 식별합니다. 계층적 순서의 필수 요소는 다음과 같습니다.

Windows 10, 버전 1809 이후(2018년 10월 업데이트)

1809 이후 vidpid 및 함수 형식은 더 이상 지정할 필요가 없으며 이러한 시스템에서 무시됩니다. 1809 이전 시스템을 대상으로 하는 경우 아래를 참조하세요.

<DeviceCapability Name="serialcommunication"/>

Windows 10, 버전 1809 이전(2018년 10월 업데이트)

  • <DeviceCapability>: Name 특성은 이어야 serialcommunication합니다.

    • <디바이스>: ID 특성은 디바이스 식별자를 지정해야 합니다. 직렬-USB 어댑터를 사용하는 경우 ID 는 공급업체/제품 식별자를 지정해야 합니다. 또는 함수 유형과 일치하는 모든 디바이스에 대한 액세스를 허용하려면 "any"일 수 있습니다.

      • <함수>: 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 포트 확장 카드)
    • 에 대한 GUID_DEVINTERFACE_COMPORT 디바이스 인터페이스 속성을 DEVPKEY_DeviceInterface_Restricted 로 설정FALSE하지 않으면 내부 디바이스에 액세스할 수 없습니다. 특정 드라이버, 특히 IoT SKU에서 이 속성을 FALSE로 설정할 수 있습니다.
    • 1903(2019년 5월 업데이트)에 따라 직렬 컨트롤러에 SerCx 액세스하거나 SerCx2 Windows 10 시작하는 경우 디바이스는 사용자 모드에서 또는 를 사용하도록 설정하여 RhProxy직접 액세스할 수 있도록 옵트인할 수 있습니다.
  • 드라이버 개발자와 협력하여 하드웨어 지원 앱을 만들어 사용자 지정 디바이스를 만들 때 이러한 제한을 무시할 수 있습니다.

클래스

ErrorReceivedEventArgs

직렬 포트에서 오류가 발생할 때 호출되는 이벤트 처리기에 매개 변수로 전달되는 개체를 나타냅니다.

PinChangedEventArgs

직렬 포트에서 신호선의 상태가 변경될 때 호출되는 이벤트 처리기에 매개 변수로 전달되는 개체를 나타냅니다.

SerialDevice

직렬 포트를 나타냅니다. 개체는 앱이 시스템에서 직렬 포트를 찾고 상호 작용하는 데 사용할 수 있는 메서드 및 속성을 제공합니다.

열거형

SerialError

직렬 포트에서 발생할 수 있는 오류 조건에 대한 값을 정의합니다.

SerialHandshake

직렬 통신에 사용되는 하드웨어 및 소프트웨어 흐름 제어 프로토콜에 대한 값을 정의합니다. 값은 SerialDevice 개체의 핸드셰이크 속성에서 사용됩니다.

SerialParity

직렬 데이터 전송의 패리티 비트 값을 정의합니다. 값은 SerialDevice 개체의 Parity 속성에서 사용됩니다.

SerialPinChange

직렬 포트의 신호 상태 변경 유형에 대한 값을 정의합니다.

SerialStopBitCount

전송에 사용되는 중지 비트 수를 나타내는 값을 정의합니다. 값은 SerialDevice 개체의 StopBits 속성에서 사용됩니다.

추가 정보