本文章是由機器翻譯。

Windows 8.1

針對 WinRT 建置以 Netduino 為基礎的 HID 感應器

Donn Morse

下载代码示例

人體學周邊設備 (HID) 議定書 》 原本以簡化設備,如滑鼠、 鍵盤和搖桿的使用。然而,由於其獨特的功能 — — 包括其自我描述性質 — — 設備製造商使用的協定以支援醫療設備、 健康和健身設備和自訂感應器。如果你是新到藏 API,請參閱 USB HID 資訊網站 (bit.ly/1mbtyTz) 來找到更多的資訊。另一個很大的資源是華德的書,"USB 完成:Devloper 的指南,第四版 》 (湖景研究 LLC,2009年)。

在 Windows 8.1 之前如果你正在寫一個 HID 設備的申請你寫一個本機 Win32 應用程式。但如果你是一個 Web 或.NET 開發人員,斜坡陡峭。要解決這個問題,Microsoft 引入 HID Windows 運行庫 (WinRT) 與 Windows 8.1 API (bit.ly/1aot1by)。這個新的 API,您可以編寫 Windows 應用商店應用程式為您的設備使用 JavaScript、Visual Basic、 C# 或 c + +。

此外,微軟最近添加支援幾種新的運輸工具,所以你不限於 USB 電纜。今天,您可以創建一種 HID 設備,發送和接收的資料包通過 USB、Bluetooth、BluetoothLE 和 I2C。(有關詳細資訊,請參閱"藏運輸工具"在 bit.ly/1asvwg6.)

在本文中,我將展示如何可以生成與 HID 協定相容的簡單溫度感應器。然後我將描述示例 Windows 應用程式商店,可以顯示來自該設備的溫度資料。

構建溫度感應器

該示例設備基於 Netduino 發展理事會 (netduino.com)。此開放原始碼板由業餘愛好者、 學術界人士和工業工程師用於生成工作原型設備。而且,因為 Netduino 是引腳相容 Arduino,您可以將附加 Arduino 盾牌,若要快速添加功能。(一個盾牌是與特定的功能,例如無線通訊、 電機控制板、 乙太網、 RS232、 液晶顯示等)我的示例設備使用 RS232 遮罩下載的固件。它使用板載 USB 連接器來傳輸和接收資料。

Netduino 支援.NET 微框架,其固件用的免費複本建立的Visual C# Express。

若要獲取溫度資料,樣本設備使用了德州儀器 LM35 感應器。感應器採用 5 伏的輸入從 Netduino 並將它轉換成當前攝氏溫度成正比的輸出電壓溫度。

下面是您需要生成您自己的 HID 感應器的部分:

  • Netduino 1 或 Netduino 加 1 (亞馬遜, amzn.to/1dvTeLh):與支援.NET 微框架的可程式設計單片機開發板。
  • RS232 盾 (CuteDigi, bit.ly/1j7uaMR):用於下載和調試固件的 RS232 模組。(這面盾牌是固件的必需的 Beta 版本的正在使用。
  • LM35 感應器 (DigiKey, bit.ly/KjbQkN):將輸入的電壓轉換為基於當前溫度的輸出電壓的溫度感應器。
  • RS232 到 USB 轉換器電纜 (視差, bit.ly/1iVmP0a):下載的溫度感應器固件通過 RS232 遮罩電纜。(請注意 FTDI 晶片組是需要與盾牌的相容性)。
  • 9V 電流為 650mA 電源 (亞馬遜, amzn.to/1d6R8LH):Netduino 板的電源。
  • USB 到微型 USB 電纜 (亞馬遜, amzn.to/Kjc8Ii):為將從 Netduino 的 HID 資料包發送到您的 Windows 8.1 平板電腦或筆記本電腦電纜。

圖 1 顯示完整的 HID 溫度感應器安裝程式。


圖 1 完整的 HID 的溫度感應器安裝

RS232 盾附加到頂部的 Netduino。線路板包含 LM35 感應器,附加到 5V、 地面和引腳 0。(引腳 0 是主機板上的六個類比到數位 [ADC] 針之一)。所以,讓我們開始吧。

您的 Netduino 1 (或 Netduino 加 1) 附帶的固件不支援 HID 協定。您需要配置您開發板通過安裝 4.1.1 版本的測試版固件,包括對 HID 的支援。你會發現一個 ZIP 檔案夾包含在 Beta 固件 bit.ly/1a7f6MB。(您會需要創建帳戶通過用秘密實驗室註冊以下載該檔。

在 Web 網站上的下載頁面包含有關更新固件的說明。然而,這些指令是相當複雜,尤其是如果你是新到 Netduino。視頻的 bit.ly/1d73P9x 是一個樂於助人、 簡明固件升級過程的描述。

您的主機板上升級固件之後,你準備開始構造的溫度感應器電路。第一步需要您將 RS232 盾附加到您的主機板。(正如我已提到,Netduino 是引腳相容與 Arduino,所以如果你一直與 Arduino 和有 RS232 盾方便,你可以使用它.)對齊到 Netduino 上的 RS232 遮罩,如中所示圖 2


圖 2 將 RS232 盾附加到 Netduino

您附加 RS232 盾後下, 一步是將溫度感應器連接到 5V 電源、 地面和 Netduino 引腳 0。圖 3,從感應器的 TI 資料表中,顯示了引腳分配。


圖 3 感應器引腳分配

安裝感應器的固件

有兩個圖層或實例的 Netduino 上的固件。第一是製造商的固件,其中包括.NET 微框架 ; 第二是您的設備的固件。製造商的固件處理設備固件發出的請求。製造商的固件到發展理事會上一次載入並執行每次電源開啟後該設備。相反,您通常刷新您的設備的固件多次在發展和成型過程中。

為了安裝任何設備固件,你首先需要安裝的實例Visual C# Express2010 開發機器上的。你會發現在下載的連結 bit.ly/1eRBed1

對於大多數的 Netduino 專案,您可以下載和調試您的固件使用本機的 USB 連接。然而,製造商提供的固件的 Beta 版本需要 RS232 連接 (這就是為什麼 RS232 盾是必需的)。

一次Visual C# Express是安裝,連接 RS232 到 USB 纜線和打開 Windows 裝置管理員,以確定哪個 COM 埠 Windows 分配給該電纜。

當我向我的開發電腦附加視差 RS232 USB 轉換器時,Windows 映射它到 COM6,作為圖 4 顯示。


圖 4 分配給 RS232 到 USB 電纜的 COM 埠

現在知道的 COM 埠與轉換器相關聯,我可以我的 Netduino 加上 1 電源開啟、 附加 RS232 到 USB 電纜,和啟動的實例Visual C# Express完成下載。

第一件事開始後要做Visual C# Express是確定正確的運輸和 COM 埠。你通過在解決方案資源管理器窗格中的專案名稱上右擊並選擇屬性功能表。

屬性對話方塊出現時,選擇.NET 微框架選項卡,進行必要的選擇,如中所示圖 5


圖 5 配置.NET 微框架屬性

指定的交通工具和設備之後, 您可以部署固件。再次,用滑鼠右鍵按一下解決方案資源管理器窗格中和,這次中的專案名稱,選擇部署。

當部署完成後時,Visual C# Express將在輸出窗格中的成功的報告。

現在,您準備將您的設備附加到 Windows 8.1 平板電腦或筆記本電腦並測試它與自訂溫度感應器應用程式範例。

首先,分離的 RS232 電纜,Netduino,關閉電源,然後重新開機它的輔助電源。開機幾秒鐘的時間給該設備,然後將 USB 電纜連線到 Netduino。後執行此操作,您應該看到您的設備添加到集合中的 HID 設備在裝置管理員。(VID 和 PID 在圖 6 對應的 VID 和 PID 的示例設備 ; 這些是供應商和產品 Id)。


圖 6 的供應商和產品 Id 的示例設備

一旦設備安裝在您的 Windows 8.1 機器上,你就會想要安裝並構建應用程式範例。這款應用程式啟動時,你可以選擇感應器並開始監視你的辦公室內的環境溫度。

設備固件

現在讓我們看看溫度感應器的設備固件詳細。首先,我想在秘密實驗室 (Netduino 的製造商) 感謝父母為他們做了,在 Netduino 平臺上支援 USB HID 的工作。此固件的起始點是一個樣本上的論壇,UsbHidEchoNetduinoApp,可在 bit.ly/1eUYxAM

支援 USB 傳輸如前所述,Microsoft 支援 HID 設備通過 USB、Bluetooth、BluetoothLE 和 I2C 運行。然而,本文仲介紹的示例設備使用 USB 傳輸。這實際上意味著什麼是 USB 驅動程式將在兩個方向移動的資料包:與設備發出的資料包都會向上傳遞到的 HID 驅動程式 (如果有感興趣的應用程式將它們傳遞給 API) ; 與 HID 驅動程式發出的資料包被傳遞回設備。

Windows 使用設備在連接時所發出的特定資料來標識它應該載入的 USB 驅動程式。

定義固件類溫度感應器設備的固件建立在兩個類:程式和感應器。程式類支援一個單一的主常式,在啟動時調用。感應器類定義溫度感應器的 USB 和 HID 設置。此外,它支援發送輸入的報告和讀取輸出報告的方法。

感應器類包含的所有配置的 USB 傳輸所需的代碼。這包括代碼是:

  • 配置一個讀取的終結點
  • 配置一個寫終結點
  • 指定供應商 ID (VID)
  • 指定的產品識別碼 (PID)
  • 指定易記名稱 (製造商名稱、 產品名稱等等)
  • 指定其他所需的 USB HID 設備設置

在配置中找到的大多數 USB 配置代碼­HID Sensors.cs 模組中的方法。這種方法,反過來,創建並初始化一個設定物件 (bit.ly/1i1IcQ3),其中包含設備的 USB 設置 (終結點、 VID、 PID 等等)。

讀取終結點允許設備從 API 和 HID 驅動程式接收的資料包。寫終結點允許驅動程式通過驅動程式堆疊發送資料包,對 API。

Windows 使用的供應商 ID、 產品識別碼 和其他 USB 設置 (在 ConfigureHID 方法中指定) 來確定設備是否是一個有效的 USB 設備,然後載入相應的驅動程式。

打開設備連接感應器類包括從內程式類的主常式調用 Open 方法。正如你可以看到在圖 7,打開方法:

  • 檢索可用的 USB 控制器
  • 調用 ConfigureHID 方法來建立設備的 USB 和 HID 設置
  • 調用 Start 方法的第一個可用控制器
  • 創建一個 USB 流物件與讀和寫的終結點

圖 7 打開方法

public bool Open()
{
  bool succeed = true;
  started = false;
  UsbController[] usbControllers = UsbController.GetControllers();
  if (usbControllers.Length < 1)
  {
    succeed = false;
  }
  if (succeed)
  {
    usbController = usbControllers[0];
    try
    {
      succeed = ConfigureHID();
      if (succeed)
      {
        succeed = usbController.Start();
      }
      if (succeed)
      {
        stream = usbController.CreateUsbStream(WRITE_ENDPOINT,
           READ_ENDPOINT);
      }
    }
    catch (Exception)
    {
      succeed = false;
    }
  }
  started = true;
  return succeed;
}

感應器類還包含一個密切的方法,當設備斷開主機筆記本電腦或平板電腦時調用。

支援 HID 的協定

HID 協定基於報告:功能報告、 輸入的報告和輸出報告。可以由主機 (就是連接的筆記本電腦或平板電腦) 或該設備發送功能報告。輸入的報告由該設備發送到主機。輸出報告發送到設備的主機。

在我們樣品溫度感應器輸入的報告是一個非常簡單的兩個位元組資料包。第一個位元組指定的當前溫度在華氏度 ; 第二個位元組表示的當前的報告時間間隔,以毫秒為單位­onds。(感應器固件問題輸入的報告在報告的時間間隔由指定的頻率)。

示例設備的輸出報告是甚至更簡單 — — 它是一個位元組,指定的報告間隔。(這是一個整數值,代表­支架以毫秒為單位的時間間隔.)

創建報告描述項如前所述,HID 設備的功能之一就是其自我-­報告性質:後連接到主機,該設備提供其目的、 功能和所稱報告描述項中的資料包格式的說明。此說明符指示設備 HID 宇宙中適合的地方 (是的滑鼠、 鍵盤、 供應商定義的設備嗎?)。描述項還指定單個功能報告、 輸入的報告和輸出報告的格式。

中所示的溫度感應器的報告描述項發現在 Sensors.cs, 圖 8

圖 8 溫度感應器的報告描述項

 

hidGenericReportDescriptorPayload = new byte[]
  {
    0x06,0x55,0xFF,     //HID_USAGE_PAGE_VENDOR_DEFINED
    0x09,0xA5,          //HID_USAGE (vendor_defined)
    0xA1,0x01,          //HID_COLLECTION(Application),
    // Input report (device-transmits)
    0x09,0xA7,          //HID_USAGE (vendor_defined)
    0x15,0x00,          //HID_LOGICAL_MIN_8(0), // Minimum temp is 0 degrees F
    0x25,0x96,          //HID_LOGICAL_MAX_8(150), // Max supported temp is
                                                  // 150 degrees F
    0x75,0x08,          //HID_REPORT_SIZE(8),
    0x95,0x01,          //HID_REPORT_COUNT(1),
    0x81,0x02,          //HID_INPUT(Data_Var_Abs),
    0x09,0xA8,          //HID_USAGE (vendor_defined)
    0x15,0x4B,          //HID_LOGICAL_MIN_8(75),   // minimum 75 ms
    0x25,0xFF,          //HID_LOGICAL_MAX_8(255),  // maximum 255 ms
    0x75,0x08,          //HID_REPORT_SIZE(8),
    0x95,0x01,          //HID_REPORT_COUNT(1),
    0x81,0x02,          //HID_INPUT(Data_Var_Abs),
    // Output report (device-receives)
    0x09,0xA9,          //HID_USAGE (vendor_defined)
    0x15,0x4B,          //HID_LOGICAL_MIN_8(75),   // minimum 75 ms
    0x25,0xFF,          //HID_LOGICAL_MAX_8(255),  // maximum 255 ms
    0x75,0x08,          //HID_REPORT_SIZE(8),
    0x95,0x01,          //HID_REPORT_COUNT(1),
    0x91,0x02,          //HID_OUTPUT(Data_Var_Abs),
    0xC0                //HID_END_COLLECTION
   };

前兩行的描述項的告知主機此特定設備是由供應商定義:

0x06,0x55,0xFF,     //HID_USAGE_PAGE_VENDOR_DEFINED
0x09,0xA5,          //HID_USAGE (vendor_defined)

通過 15 四線指示兩個位元組輸入報告的格式。 通過九行四文字描述的第一個位元組的輸入報告,指定的溫度讀數:

0x09,0xA7,          //HID_USAGE (vendor_defined)
0x15,0x00,          //HID_LOGICAL_MIN_8(0), // Minimum temp is 0 degrees F
0x25,0x96,          //HID_LOGICAL_MAX_8(150), // Max supported temp is  
                                              // 150 degrees F
0x75,0x08,          //HID_REPORT_SIZE(8),
0x95,0x01,          //HID_REPORT_COUNT(1),
0x81,0x02,          //HID_INPUT(Data_Var_Abs),

10 日通過第 15 行描述的第二個位元組的輸入報告,指定報告的時間間隔 (以毫秒為單位):

0x09,0xA8,          //HID_USAGE (vendor_defined)
0x15,0x4B,          //HID_LOGICAL_MIN_8(75),   // minimum 75 ms
0x25,0xFF,          //HID_LOGICAL_MAX_8(255),  // maximum 255 ms
0x75,0x08,          //HID_REPORT_SIZE(8),
0x95,0x01,          //HID_REPORT_COUNT(1),
0x81,0x02,          //HID_INPUT(Data_Var_Abs),

該示例設備的報告描述項是作為 UsbController.Configuration 物件的一部分包括 (bit.ly/1cvcq5G),它創建,在 Sensor.cs ConfigureHID 方法內。

支援 HID 輸入報告輸入的報告被定義為結構在 Sensor.cs 模組中:

struct InputReport
{
  public byte Temperature; // Temperature in degrees Fahrenheit
  public byte Interval;    // Report interval (or frequency) in seconds
}

固件問題輸入報告使用 UsbStream 物件 (bit.ly/1kElfUZ) 在打開的方法中創建它。 當固件調用流時從 SendInputReport 方法發出這些輸入的報告。編寫方法:

protected void SendInputReport(InputReport report)
{
  byte[] inputReport = new byte[2];
  inputReport[0] = (byte)report.Temperature;
  inputReport[1] = (byte)report.Interval;
  stream.Write(inputReport, 0, 2);
}

發行與輸入報告溫度資料更新感應器類中的方法問題輸入的報告到所連接的主機:

public int Update(int iTemperature, int iInterval)
{
  InputReport inputReport = new InputReport();
  byte Interval = 0;
  inputReport.Temperature = (byte)iTemperature;
  inputReport.Interval = (byte)iInterval;
  SendInputReport(inputReport);
  Interval = GetOutputReport();
  return (int)Interval;
}

從內部無限 while 迴圈,所示調用 Update 方法圖 9,其中執行中的固件主常式 (在 Program.cs 中找到)。

圖 9 中 While 迴圈調用 Update 方法

while (true)
{
  // Retrieve the current temperature reading
  milliVolts = (double)voltsPin.Read();  // Read returns a value in the
                                         // specified range
  tempC = milliVolts / 10.0;             // Sensor returns 10mV per  
                                         // degree Centigrade
  tempF = 1.8 * tempC + 32;              // Convert to degrees Fahrenheit
  simpleTemp = (int)tempF;
  // Because there are voltage fluctuations when the external
  // power supply is connected to the Netduino, use a running
  // average to "smooth" the values
  if (firstReading)
  {
    firstReading = false;
    currentTemp = simpleTemp;
    for (i = 0; i < 12; i++)
      tempArray[i] = simpleTemp;
    }
  else
  {
    tempArray = Shift(simpleTemp, tempArray);  // Shift the array elements and
                                               // insert the new temp
    currentTemp = Average(tempArray);          // Compute a running average of
                                               // the last 12 readings
  }
  RequestedInterval = sensor.Update(currentTemp, CurrentInterval);
  // Check for a possible new interval requested via an
  // output report
  if (RequestedInterval != 0)
  {
    CurrentInterval = RequestedInterval;
  }
  led.Write(true);
  Thread.Sleep(CurrentInterval);
  led.Write(false);
  }
}

支援 HID 輸出報告輸出報表定義為一個在 Sensor.cs 模組中的結構:

struct OutputReport
{
  public byte Interval; // Report interval (or frequency) in seconds
}

固件收到它在 Open 方法中創建相同的 UsbStream 物件通過輸出報告。 GetOutputReport 方法內收到的這些輸出報告:

protected byte GetOutputReport()
{
  byte[] outputReport = new byte[1];
  int bytesRead = 0;
  if (stream.CanRead)
  {
  bytesRead = stream.Read(outputReport, 0, 1);
  }
  if (bytesRead > 0)
  return outputReport[0];
  else
  return 0;
}

調整報告間隔與輸出報告固件支援以毫秒為單位指定報告間隔。 受支援的最小間隔是 75 毫秒 ; 最大間隔是 255 毫秒。 應用程式通過向設備發送輸出報告請求新的間隔。 該設備,反過來,報告在每個輸入的報表,它將發送到任何連接的應用程式中的目前時間間隔。

固件通過調用 Thread.Sleep 方法適用目前時間間隔 (bit.ly/LaSYVF) 為指定由目前時間間隔的秒數:

led.Write(true);
Thread.Sleep(CurrentInterval);
led.Write(false);

通過暫停 while 迴圈此持續時間,註冊的應用程式接收輸入的報告在指定的時間間隔。

HID 的溫度感應器應用程式

應用程式範例演示如何使用新的 HID WinRT API 為 Windows 8.1 附 HID 溫度感應器的溫度資料的顯示方式。這個新的 API 允許您從 HID 設備中檢索資料,以及控制他們的應用程式。

此示例旨在與連接的 HID 設備,檢測到溫度從 0 到 150 華氏度工作。這款應用程式監視,然後顯示溫度感應器的當前讀數。

這款應用程式支援三種的"方案",每個哪些映射到應用程式的 UI 中的特定功能。此外,每個方案將映射到相應的 XAML 和 C# 原始程式碼檔。下面列出了每個方案,其相應的模組和它的功能:

設備連接 (Scenario1_ConnectToSensor.xaml ; ) Scenario1_ConnectToSensor.xaml.cs

  • HID 設備連接到 Windows 8.1 PC 連接的支援。
  • 這樣,使用者可以選擇其中一個枚舉連接的溫度感應器。
  • 建立了一個設備觀察程式,監視設備的狀態。(設備觀察程式激發事件當使用者斷開連接或重新連接所選的 HID 設備)。

獲取溫度資料 (Scenario2_GetTemperatureData.xaml ; ) Scenario2_GetTemperatureData.xaml.cs

  • 監視選擇的溫度感應器。
  • 描述了一個溫度儀錶並呈現使用滑塊控制項的當前讀數。

設置報告間隔 (Scenario3_SetReportInterval.xaml ; ) Scenario3_SetReportInterval.xaml.cs

  • 允許使用者控制的溫度感應器報告其狀態的頻率。(預設間隔時間是 250 毫秒,但使用者可以選擇從 75 ms 到 250 毫秒的時間間隔)。

支援的設備的連接

設備連接方案使 HID 設備連接到 Windows 8.1 PC 的幾個方面:枚舉連接的設備,建立設備觀察程式、 處理設備斷開連接和處理設備重新連接。

建立設備的連接處理設備連接的代碼在三個模組中找到:Scenario1_ConnectToSensor.xaml.cs、 EventHandlerForDevices.cs 和 DeviceList.cs。(第一個模組包含主代碼的這種情況下 ; 其他兩個包含支援的功能)。

第一階段的連接發生之前是可見的使用者介面。在此階段中,應用程式創建一個 DeviceWatcher 物件,當設備被添加、 刪除或更改時通知應用程式。在顯示的使用者介面,使用者能夠從連接的 HID 設備選擇一個特定設備後發生的第二階段。這款應用程式顯示裝置­實例 Id 字串的每個已連接的設備 ; 該字串包括給定設備的 VID 和 PID。在樣品溫度感應器,DeviceInstanceId 字串具有表單:

HID\VID_16C0&PID_0012\6&523698d&0&0000

圖 10 顯示 app 後已完成枚舉和使用者已連接到設備。


圖 10 Windows 8.1 應用程式連接到 HID 設備

設備連接第一階段在這裡是在設備連接 (之前顯示的使用者介面),以及任務完成的每個方法的第一階段過程中調用的方法:

DeviceConnect (Scenario1_DeviceConnect.xaml.cs) 來調用 CustomTemperatureSensor.InitializeComponent 方法,初始化應用程式的 UI 元件 (例如文字區塊和按鈕。

InitializeDeviceWatchers(Scenario1_DeviceConnect.xaml.cs) 來調用 HidDevice.GetDeviceSelector 方法以檢索設備選擇器字串。(選擇器必需以創建一個設備觀察程式)。一旦獲得該選擇器,應用程式調用 DeviceInformation.CreateWatcher 來創建 DeviceWatcher 物件,然後 EventHandler­ForDevice.Current.Add­DeviceWatcher。(最後一種方法允許應用程式來監測設備狀態的變化)。

AddDeviceWatcher (EventHandlerForDevices.cs) 創建三個設備事件的事件處理常式:已完成的枚舉,添加設備和設備中刪除。

SelectDeviceInList(Scenario1_DeviceConnect.xaml.cs) 檢查,看看使用者所選的設備,如果是這樣,它保存為該設備的索引。

在藏了 API,感興趣的主要代碼發現在 InitializeDeviceWatchers 方法中,所示圖 11。此代碼來調用 HidDevice.GetDeviceSelector 方法 (bit.ly/1eGQI1k),並傳遞 UsagePage、 UsageId、 VID 和 PID 的溫度感應器。

圖 11 InitializeDeviceWatchers 方法

private void InitializeDeviceWatchers()
{
  // Custom sensor
  var CustomSensorSelector =
    HidDevice.GetDeviceSelector(CustomSensor.Device.UsagePage,
    CustomSensor.Device.UsageId, CustomSensor.Device.Vid,
    CustomSensor.Device.Pid);
  // Create a device watcher to look for instances of the custom sensor
  var CustomSensorWatcher =
    DeviceInformation.CreateWatcher(CustomSensorSelector);
  // Allow EventHandlerForDevice to handle device watcher events that
  // relate or affect the device (device removal, addition, app
  // suspension/resume)
  AddDeviceWatcher(CustomSensorWatcher, CustomSensorSelector);
}

在檔 constants.cs 中定義的 UsagePage 和 UsageId 的值:

public class Device
{
  public const UInt16 Vid = 0x16C0;
  public const UInt16 Pid = 0x0012;
  public const UInt16 UsagePage = 0xFF55;
  public const UInt16 UsageId = 0xA5;
}

這些類成員對應于該設備的固件中定義的 HID 報告描述項中指定的值:

hidGenericReportDescriptorPayload = new byte[]
{
  0x06,0x55,0xFF,     //HID_USAGE_PAGE_VENDOR_DEFINED
  0x09,0xA5,          //HID_USAGE (vendor_defined)

GetDeviceSelector 方法在 CustomSensorSelector 變數中返回一個高級查詢語法 (AQS) 字串。App 時它將創建一個設備觀察程式和當它枚舉的 DeviceInformation 物件,然後使用此字串。

第二個階段的設備連接第二階段的設備連接允許使用者從清單中選擇的連接設備。這一階段確立了當前所選的設備。(全部在 EventHandlerForDevices.cs) 調用的方法和每一個不會在這裡。

OpenDeviceAsync 打開到該設備的連接。

應用程式暫停和恢復事件的 RegisterForAppEventsregisters。

RegisterForDeviceAccessStatusChange 監聽設備存取權限的變化。

RegisterForDeviceWatcherEvents 寄存器的添加和移除事件。

StartDeviceWatcher 啟動設備觀察程式。

SelectDeviceInListchecks,如果使用者所選的設備,並且,如果是這樣,請參閱保存為該設備的索引。它還"當前連接......"將字串寫入輸出視窗如果連接不成功。

在藏了 API,感興趣的主要代碼是在 OpenDeviceAsync 方法中。此代碼調用 HidDevice.From­IdAsync 方法 (bit.ly/1hyhVpI),它返回一個 HidDevice 物件 (bit.ly/1dsD2rR) 這款應用程式用來訪問設備、 檢索輸入的報告併發送輸出報告:

public async Task<Boolean> OpenDeviceAsync(DeviceInformation deviceInfo,
  String deviceSelector)
  {
    // This sample uses FileAccessMode.ReadWrite to open the device
    // because you don’t want other apps opening the device and  
    // changing the state of the  device.
// FileAccessMode.Read can be used instead.
device = await HidDevice.FromIdAsync(deviceInfo.Id, 
        FileAccessMode.ReadWrite);
...

支援設備守望者當應用程式初次開機和開始甚至之前顯示的使用者介面時,會發生設備枚舉。枚舉完成後,該應用程式監視設備的狀態。

設備狀態報表的一個 DeviceWatcher 物件 (bit.ly/1dBPMPd)。顧名思義,此物件"手錶"連接的設備 — —­如果使用者刪除或將其設備連接,觀察程式向應用程式報告事件。(這些只報告事件枚舉過程完畢後)。

正在檢索輸入的報表

溫度檢索方案監測發表的溫度感應器的輸入的報告和使用滑塊控制項來顯示當前溫度,如中所示圖 12。(請注意此控制項是限於顯示溫度資料。IsDoubleTapEnabled、 IsHoldingEnabled、 IsRightTapEnabled 和 IsTapEnabled 都已設置屬性為 False。)


圖 12 顯示當前溫度

支援這種情況的主要方法是 OnInput­ReportEvent 事件處理常式,在 Scenario2_GetTemperature 中找到­Data.xaml.cs。這款應用程式註冊此事件處理常式,當使用者選擇 Get 溫度資料方案,並且為溫度檢測按鈕按登記冊。這款應用程式註冊的事件處理常式內的 RegisterForInputReportEvents 方法。除了註冊處理常式,此方法保存事件標記,所以它可以登出。

private void RegisterForInputReportEvents()
{
  if (!isRegisteredForInputReportEvents)
  {
    inputReportEventHandler = new TypedEventHandler<HidDevice,
      HidInputReportReceivedEventArgs>(this.OnInputReportEvent);
    registeredDevice = EventHandlerForDevice.Current.Device;
    registeredDevice.InputReportReceived += inputReportEventHandler;
    isRegisteredForInputReportEvents = true;
  }
}

一旦註冊的事件處理常式,它會讀取每個輸入的報告由感應器發出和使用的新的溫度值來更新的 TemperatureSlider 控制項。它將更新該控制項後,此方法的當前溫度和報告時間間隔將值寫入到該應用程式的輸出部分中所示圖 13

圖 13 閱讀和顯示感應器資料

private async void OnInputReportEvent(HidDevice sender,
  HidInputReportReceivedEventArgs eventArgs)
{
  // Retrieve the sensor data
  HidInputReport inputReport = eventArgs.Report;
  IBuffer buffer = inputReport.Data;
  DataReader dr = DataReader.FromBuffer(buffer);
  byte[] bytes = new byte[inputReport.Data.Length];
  dr.ReadBytes(bytes);
  // Render the sensor data
  await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
  {
    CurrentReadingText.TextAlignment = TextAlignment.Center;
    CurrentReadingText.Text = bytes[1].ToString();
    TemperatureSlider.Value = (int)bytes[1];
    rootPage.NotifyUser(bytes[1].ToString() + 
     " degrees Fahrenheit, " +
      bytes[2].ToString() +
      " millisecond report-interval", NotifyType.StatusMessage);
  });
}

發送輸出報告

報告間隔方案將輸出報告發送到溫度感應器和寫入的位元組數,以及寫入到應用程式的視窗的輸出區域的值的計數。這款應用程式發送輸出報告後,使用者選擇的時間間隔設置的報表方案、 選擇一個值從值到寫下拉清單中,然後按下發送輸出報告按鈕。

圖 14 顯示設定的報告間隔方案和填充的報告間隔選項的下拉清單。(這些值表示一個報告間隔以毫秒為單位 ; 因此,通過選擇 100,這款應用程式將接收 10 讀數每分每秒)。


圖 14 設置報告間隔

報告間隔方案中的主要方法是 SetReportIntervalAsync,在 Scenario3_SetReport 中找到­Interval.xaml.cs 模組 (請參閱圖 15)。此方法調用 HidDevice.SendOutputReportAsync 方法 (bit.ly/1ad6unK) 向設備發送輸出報告。

圖 15 SetReportIntervalAsync

private async Task SetReportIntervalAsync(Byte valueToWrite)
{
  var outputReport =
    EventHandlerForDevice.Current.Device.CreateOutputReport();
  var dataWriter = new DataWriter();
  // First byte contains the report id
  dataWriter.WriteByte((Byte)outputReport.Id);
  dataWriter.WriteByte((Byte)valueToWrite);
  outputReport.Data = dataWriter.DetachBuffer();
  uint bytesWritten =
    await EventHandlerForDevice.Current.Device.
SendOutputReportAsync(outputReport);
  rootPage.NotifyUser("Bytes written:  " + 
    bytesWritten.ToString() + ";
    Value Written: " + valueToWrite.ToString(), 
        NotifyType.StatusMessage);
}

結論

第一次我給你快速看看建設監測由一個簡單的感應器發出的電壓 HID 設備。 您如何可以監視一個感應器,用於切換數位 I/O 引腳 (而不發光的電壓範圍內) 的示例,請參見動作感應器示例在 MSDN 上 bit.ly/1gWOlcC

然後編寫一個簡單的應用程式,監視和控制 HID 設備快速看了你。 關於 HID WinRT API 的詳細資訊,請訪問 bit.ly/1aot1by

Donn Morse 是在微軟高級內容開發。聯繫到他在 donnm@microsoft.com

衷心感谢以下技术专家对本文的审阅:艾亞爾 Arvind (Microsoft)
Arvind 艾亞爾是在微軟高級軟體發展工程師。 除其他外,他是負責創建新的 HID WinRT API 的開發人員。