USB デバイスへの接続方法 (UWP アプリ)How to connect to a USB device (UWP app)

概要Summary

  • 使用する方法、 DeviceWatcher デバイスを検出するオブジェクトHow to use the DeviceWatcher object to detect devices
  • 通信用にデバイスを開く方法How to open the device for communication
  • 使用してこれが完了したら、デバイスを閉じる方法How to close the device when you are finished using it

重要な APIImportant APIs

USB デバイスと対話する UWP アプリを記述するときに、アプリことができます制御コマンドを送信、デバイスの情報を取得し、読み取りおよび書き込み一括および割り込みのエンドポイントとの間のデータ。When you write a UWP app that interacts with a USB device, the app can send control commands, get device information, and read and write data to/from bulk and interrupt endpoints. すべての操作を行うことができます、前にデバイスを検出し、接続を確立する必要があります。Before you can do all that, you must find the device and establish connection.

はじめに...Before you start...

  • これは、一連の最初のトピックです。This is the first topic in a series. このチュートリアルを開始する前に、このチュートリアルでは拡張可能な基本的な Visual Studio プロジェクトを作成する必要があります。Before you start this tutorial, you must have created a basic Visual Studio project that you can extend in this tutorial. 読み取りUWP アプリの概要の詳細。Read Getting started with UWP apps for more info.
  • コード例は、CustomUsbDeviceAccess サンプルに基づいています。Code examples are based on the CustomUsbDeviceAccess sample. 完全なサンプルは、このコード ギャラリーのページからダウンロードできます。You can download the complete sample from this code gallery page.
  • チュートリアルで使用する USB デバイスは、SuperMUTT デバイスです。The USB device used in tutorial is the SuperMUTT device.
  • 使用するには、 Windows.Devices.Usb USB デバイス、デバイスと連携する Windows アプリを作成する名前空間は、その関数のドライバーとして読み込まれます Winusb.sys のドライバーを使用する必要があります。In order to use the Windows.Devices.Usb namespace to write a Windows app that interacts with a USB device, the device must have the Winusb.sys driver loaded as its function driver. Winusb.sys が Microsoft によって提供されでの Windows に含まれている、 \Windows\System32\ドライバーフォルダー。Winusb.sys is provided by Microsoft and is included with Windows in the \Windows\System32\drivers folder.

フローチャート:デバイスの検索Flowchart: Finding the device

USB デバイスに接続するには、最初の検出のさまざまなパターンに基づいてデバイスを検索しに接続しする必要があります。To connect to a USB device, you must first find the device based on various discovery patterns and then connect to it:

  • 特定のデバイス インターフェイスの GUID を持つ任意の USB デバイスに接続します。Connect to any USB device with a specific device interface GUID.
  • ベンダー ID と製品 ID は、特定の USB デバイスに接続して、特定のデバイス インターフェイスの GUID を持ちます。Connect to a USB device with a particular Vendor ID and Product ID and that has a specific device interface GUID.
  • USB デバイスに特定のベンダー ID と製品 ID を知らなくても接続デバイス インターフェイスの GUID。Connect to a USB device with a particular Vendor ID and Product ID without knowing the device interface GUID.
  • デバイスのクラスが知られている USB デバイスに接続します。Connect to a USB device which has known device class.

usb デバイスの検出

主要概念Key concepts

デバイス インターフェイスの GUID とは何ですか。What is a device interface GUID?

カーネル モード ドライバーを初期化、レジスタ、および GUID と呼ばれる公開中に、デバイス インターフェイスの GUIDします。A kernel-model driver, during its initialization, register and exposes a GUID called the device interface GUID. 通常、アプリでは、公開されている GUID を使用して、関連するドライバーとそのデバイスを検索し、デバイスを識別するハンドルを開きます。Typically, the app uses the exposed GUID to find the associated driver and its device, and then open a handle to the device. 取得されたハンドルは、後続の読み取りおよび書き込み操作に使用されます。The retrieved handle is used for subsequent read and write operations.

ただし、Winusb.sys の場合、ドライバーの GUID、デバイスのインターフェイスを公開する代わりに提供する 2 つの方法のいずれかで。However, in the case of Winusb.sys, instead of the driver exposing the device interface GUID, it can be provided in one of two ways:

  • デバイスの OS の MS 記述子。In the device's MS OS descriptors. デバイスの製造元セットDeviceInterfaceGUIDデバイスに拡張プロパティ記述子にカスタム プロパティとして。The device manufacturer sets DeviceInterfaceGUID as a custom property in the extended properties descriptor in the device. 詳細についてで「拡張プロパティの記述子」のドキュメントを参照してください。 Microsoft OS ディスクリプターします。For more details, see the "Extended Properties Descriptors" document in Microsoft OS Descriptors.
  • 手動でカスタム INF Winusb.sys をインストールした場合、INF は、INF に GUID を登録します。If you installed Winusb.sys manually through a custom INF, the INF registered a GUID in the INF. 参照してくださいWinUSB (Winusb.sys) インストールします。See WinUSB (Winusb.sys) Installation.

デバイスの GUID が検出するデバイスのインターフェイス場合、UWP アプリは、そのデバイス インターフェイスの GUID と一致するすべてのデバイスを検索できます。If a device interface GUID is found for the device, your UWP app can find all devices that match that device interface GUID.

Windows での USB デバイス id の表示方法How is USB device identification shown in Windows?

すべての USB デバイスが 2 つの情報をいる必要があります: 仕入先 ID と製品 id。Every USB device must have two pieces of information: vendor ID and product ID.

USB の割り当ての場合はこれらの id とデバイスの製造元する必要がありますそれらに公開デバイス。USB-IF assigns those identifiers and the device manufacturer must expose them in the device. その情報をどのように入手できますか。So how can you obtain that information?

  • 読み込まれるデバイス ドライバーがない場合、デバイスの場合でも、Windows が「不明なデバイス」として検出、でも表示できます、識別子のデバイス マネージャーに、ハードウェア Idプロパティの値。Even when the device doesn't have a device driver loaded, that is, Windows detects it as an "Unknown Device", you can still view the identifiers in the Device Manager in the Hardware Id property value. その値は、これら 2 つの識別子の組み合わせです。That value is a combination of those two identifiers. SuperMUTT デバイスなどのハードウェア Idは"USB\VID_045E & PID_F001"ベンダー id は"0x045E"と、製品 id が"0xF001";。For example, for the SuperMUTT device, the Hardware Id is "USB\VID_045E&PID_F001"; vendor id is "0x045E" and product id is "0xF001".

  • デバイスに対して、INF がある場合からには、その文字列を取得、モデルセクション。If there is an INF for the device, obtain that string from the Models section.

  • さまざまなレジストリ設定を検査することができます。You can inspect various registry settings. 最も簡単な方法を参照してください、The easiest way is to see the

    HKEY_ローカル_マシン\システム\ControlSet001\Enum\USB\<ハードウェア id>HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\USB\<hardware id>

    詳細については、次を参照してください。 USB デバイスのレジストリ エントリします。For more information, see USB Device Registry Entries.

  • アプリ マニフェストによってハードウェア ID を使用して、デバイスを識別します。Hardware ID is used by the app manifest to identify the device.

    <デバイス Id ="vidpid:045e f001"><Device Id="vidpid:045e f001">

UWP アプリでは、特定の製造元とプロダクト id に一致するすべてのデバイスを検索できます。Your UWP app can find all devices that match a specific vendor and product ids. デバイス インターフェイスの GUID を指定することで、検索結果を絞り込むことができます。You can narrow the search results by specifying the device interface GUID.

USB デバイス クラスとはWhat are USB device classes?

USB によって承認されたデバイス クラス仕様に準拠しているほとんどの USB デバイスの場合。Most USB devices conform to device class specifications approved by USB-IF. これらの仕様を使用するのような性質のデバイスは、標準的な方法でそれらの機能を示すことができます。By using those specifications, devices of similar nature can exhibit their functionality in a standard way. このアプローチの最大の利点は、デバイスが提供される Microsoft のインボックス クラス ドライバーまたは Winusb.sys の一般的なドライバーを使用できることです。The biggest advantage of this approach is that the device can use a Microsoft provided in-box class driver or the generic Winusb.sys driver.

一部のデバイスが USB に従っていないの場合に指定します。Some devices might not follow a USB-IF specification. 代わりに、公開ベンダー定義機能します。Instead they expose vendor-defined functionality. このようなデバイスの場合、ベンダーは、デバイス ドライバーを提供する必要がありますか、または Winusb.sys ことができます。For such devices, either the vendor must provide the device driver or Winusb.sys can be used.

このデバイスを記述する必要があります、デバイスがベンダー定義またはデバイス クラスに準拠している、かどうかクラスの関連情報。Whether a device is vendor-defined or conforms to a device class, it must describe this device class related information:

  • クラス コード:デバイスが所属するデバイス クラスを示します。Class code: Indicates the device class to which the device belongs.
  • サブクラス コード:デバイスのクラス内でデバイスのサブクラスを示します。Subclass code: Within the device class, indicates the subclass of device.
  • プロトコルのコード:デバイスを使用するプロトコル。Protocol code: The protocol that the device uses.

たとえば、SuperMUTT デバイスは、ベンダー定義されているデバイスと、FF は、情報は、クラスのコードによって示されます。For example, the SuperMUTT device is a vendor-defined device and that information is indicated by class code is FF. デバイスは、FEh、02 の h としてサブクラス コードおよびプロトコル コード 00 h としてクラスのコードを示している場合、デバイスが準拠クラス IrDA ブリッジ デバイスであるかを判断できます。If your device shows class code as FEh, subclass code as 02h, and protocol code 00h, you can conclude that the device is a class-compliant IrDA bridge device. UWP アプリは、これらのデバイス クラスに属しているデバイスと通信できます。Your UWP app can communicate with devices that belong to these device classes:

  • ActiveSyncActiveSync
  • CdcControlCdcControl
  • DeviceFirmwareUpdateDeviceFirmwareUpdate
  • IrDAIrDA
  • 測定Measurement
  • PalmSyncPalmSync
  • PersonalHealthcarePersonalHealthcare
  • 運動能力Physical
  • ベンダー固有VendorSpecific

UWP アプリでは、クラス、サブクラスでは、およびプロトコルのコードの特定のセットと一致するすべてのデバイスを検索できます。Your UWP app can find all devices that match a specific set of class, subclass, and protocol codes.

デバイスの高度なクエリ構文 (AQS) 文字列を取得します。Get the Advanced Query Syntax (AQS) string for the device

検出するために使用するデバイスの識別情報を含む高度なクエリ文字列 (AQS) を生成します。Generate an advanced query string (AQS) that contains identification information about the device that you want to detect. ベンダーと製品 Id、デバイス インターフェイスの GUID を指定することで、またはデバイス クラスでは、文字列を生成できます。You can generate the string either by specifying the vendor/product IDs, device interface GUID, or by the device class.

  • ベンダー ID/製品 ID またはデバイス インターフェイスの GUID を指定する場合のオーバー ロードを呼び出す GetDeviceSelectorします。If you want to provide the vendor ID/product ID or the device interface GUID, call any overload of GetDeviceSelector.

    SuperMUTT デバイスの例では GetDeviceSelector この文字列に類似した AQS 文字列を取得します。In the example of the SuperMUTT device, GetDeviceSelector retrieves an AQS string similar to this string:

    "System.Devices.InterfaceClassGuid:="{DEE824EF-729B-4A0E-9C14-B7117D33A817}" AND System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True AND System.DeviceInterface.WinUsb.UsbVendorId:=1118 AND System.DeviceInterface.WinUsb.UsbProductId:=61441"

      デバイス インターフェイス、文字列に表示される GUID がない 1 つの指定したことを確認します。Note  Notice that the device interface GUID that appears in the string is not the one you specified. この GUID は、実際のデバイス インターフェイス UWP アプリの Winusb.sys によって登録された GUID です。That GUID is the actual device interface GUID registered by Winusb.sys for UWP apps.

  • デバイスまたはそのクラス、サブクラスでは、およびプロトコルのコードのデバイス クラスがわかっている場合は、呼び出す GetDeviceClassSelector AQS 文字列を生成します。If you know the device class of the device or its class, subclass, and protocol codes, call GetDeviceClassSelector to generate the AQS string.

    作成、 UsbDeviceClass オブジェクトを指定して ClassCode SubclassCode、および ProtocolCode プロパティの値。Create a UsbDeviceClass object by specifying ClassCode, SubclassCode, and ProtocolCode property values. または、デバイスのデバイス クラスがわかっている場合は、コンス トラクターを呼び出す特定を指定することによって UsbDeviceClasses プロパティ。Alternatively, if you know the device class of the device, you can call the constructor by specifying a particular UsbDeviceClasses property.

デバイスの検索-基本的な方法Finding the device—The basic way

これは、USB デバイスを検索する最も簡単な方法です。This is the simplest way to find a USB device. 詳細については、次を参照してください。クイック スタート: デバイスを使用する一般的な列挙します。For details, see Quickstart: enumerating commonly used devices.

  1. 取得した AQS 文字列を渡す FindAllAsyncします。Pass the retrieved AQS string to FindAllAsync. 呼び出しを取得、 DeviceInformationCollection オブジェクト。The call retrieves a DeviceInformationCollection object.
  2. コレクションをループします。Loop through the collection. 各イテレーションの取得、 DeviceInformation オブジェクト。Each iteration gets a DeviceInformation object.
  3. 取得、 DeviceInformation.Id プロパティの値。Get the DeviceInformation.Id property value. 文字列値は、デバイスのインスタンス パスです。The string value is the device instance path. たとえば、"\\\\?\\USB#VID_045E & PID_078F#6 & 1b8ff026 & 0 & 5#{dee824ef-729b-4a0e-9c14-b7117d33a817}"。For example, "\\\\?\\USB#VID_045E&PID_078F#6&1b8ff026&0&5#{dee824ef-729b-4a0e-9c14-b7117d33a817}".
  4. 呼び出す FromIdAsync デバイス インスタンスの文字列と取得を渡すことによって、 UsbDevice オブジェクト。Call FromIdAsync by passing the device instance string and get the UsbDevice object. 使用することができますし、 UsbDeviceコントロール転送の送信などの他の操作を実行するオブジェクト。You can then use the UsbDevice object to perform other operations, such as sending a control transfer. アプリがいつ終了したを使用して、 UsbDeviceオブジェクト、アプリを呼び出すことによって解放する必要があります閉じるします。When the app has finished using the UsbDevice object, the app must release it by calling Close.   と UWP アプリの中断、デバイスが自動的に閉じられます。Note  When UWP app suspends, the device is closed automatically. 古いハンドルを使用して、今後の操作を避けるため、アプリをリリースする必要があります、 UsbDevice 参照。To avoid using a stale handle for future operations, the app must released the UsbDevice reference.
    private async void OpenDevice()
    {
        UInt32 vid = 0x045E;
        UInt32 pid = 0x0611;

        string aqs = UsbDevice.GetDeviceSelector(vid, pid);

        var myDevices = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(aqs);

        try
        {
            usbDevice = await UsbDevice.FromIdAsync(myDevices[0].Id);
        }
        catch (Exception exception)
        {
            ShowStatus(exception.Message.ToString());
        }
        finally        
        {
            ShowStatus("Opened device for communication.");
        }

    }

デバイスの検出-DeviceWatcher を使用します。Find the device—using DeviceWatcher

デバイスを動的に列挙することができます。Alternatively, you can enumerate devices dynamically. 次に、アプリは、デバイスが追加または削除される場合、またはデバイスのプロパティを変更する場合、通知を受信できます。Then, your app can receive notification if devices are added or removed, or if device properties change. 詳細については、次を参照してください。デバイスを追加する場合に通知を取得する方法は、削除、または変更します。For more information, see How to get notifications if devices are added, removed, or changed.

A DeviceWatcher オブジェクトが動的にデバイスを検出するように、追加、システムから削除するアプリを使用できます。A DeviceWatcher object enables an app to dynamically detect devices as they get added and removed from the system.

  1. 作成、 DeviceWatcher デバイスが追加またはシステムから削除されるタイミングを検出するオブジェクト。Create a DeviceWatcher object to detect when the device is added to or removed from the system. 呼び出すことによって、オブジェクトを作成する必要があります CreateWatcher AQS 文字列を指定するとします。You must create the object by calling CreateWatcher and specifying the AQS string.

  2. 実装し、ハンドラーを登録 Added から削除された上のイベント、 DeviceWatcher オブジェクト。Implement and register handlers for Added and Removed events on the DeviceWatcher object. これらのイベント ハンドラーは、(同じ id 情報) を持つデバイスを追加またはシステムから削除されたときに呼び出されます。Those event handlers are invoked when devices (with the same identification information) are added or removed from the system.

  3. 開始し、停止、 DeviceWatcher オブジェクト。Start and stop the DeviceWatcher object.

    アプリを起動する必要があります、 DeviceWatcher オブジェクトを呼び出すことによって開始追加されたデバイスの検出を開始するため、またはシステムから削除します。The app must start the DeviceWatcher object by calling Start so that it can start detecting devices as they are added or removed from the system. 逆に、アプリが停止する必要があります、 DeviceWatcher呼び出して停止デバイスを検出するために必要でなくなったとき。Conversely, the app must stop the DeviceWatcher by calling Stop, when it's no longer necessary to detect devices. このサンプルでは、ユーザーを開始および停止できる 2 つのボタンDeviceWatcherします。The sample has two buttons that allows the user to start and stop DeviceWatcher.

このコード例は、作成し、検索するデバイスの監視を開始する方法を示しています。 SuperMUTT デバイスのインスタンス。This code example shows how to create and start a device watcher to look for instances of the SuperMUTT device.

void CreateSuperMuttDeviceWatcher(void)
{
    UInt32 vid = 0x045E;
    UInt32 pid = 0x0611;

    string aqs = UsbDevice.GetDeviceSelector(vid, pid);  
    
    var superMuttWatcher = DeviceInformation.CreateWatcher(aqs);
  
    superMuttWatcher.Added += new TypedEventHandler<DeviceWatcher, DeviceInformation>
                              (this.OnDeviceAdded);

    superMuttWatcher.Removed += new TypedEventHandler<DeviceWatcher, DeviceInformationUpdate>
                            (this.OnDeviceRemoved);

    superMuttWatcher.Start();
 }

デバイスを開くOpen the device

デバイスを開くには、アプリは、静的メソッドを呼び出して非同期操作を開始する必要があります FromIdAsync デバイス インスタンスのパスを渡すと (から取得した DeviceInformation.Id)。To open the device, the app must start an asynchronous operation by calling the static method FromIdAsync and passing the device instance path (obtained from DeviceInformation.Id). その操作の結果を取得することは、 UsbDevice オブジェクトで、デバイスが、データ転送の実行などの将来の通信に使用します。That result of that operation obtain is a UsbDevice object, which is used for future communication with the device, such as performing data transfers.

完了した後を使用して、 UsbDevice オブジェクト、それを解放する必要があります。After you are finished using the UsbDevice object, you must release it. オブジェクトを解放することによって、すべての保留中のデータ転送が取り消されました。By releasing the object, all pending data transfers are canceled. これらの操作の完了コールバック ルーチンは取り消されたエラーまたは完了した操作でも呼び出されます。The completion callback routines for those operations are still invoked with canceled error or the operation completed.

C++ アプリを使用して参照を解放する必要があります、削除キーワード。C++ apps must release the reference by using the delete keyword. C#または VB のアプリを呼び出す必要があります、 UsbDevice.Dispose メソッド。C#/VB apps must call the UsbDevice.Dispose method. JavaScript アプリを呼び出す必要があります UsbDevice.Closeします。JavaScript apps must call UsbDevice.Close.

FromIdAsync 失敗する場合は、デバイスが使用するかが見つかりません。The FromIdAsync fails if the device is in use or cannot be found.