1. 程式人生 > 其它 >C# (Winform)實現USB HID自定義介面操作(控制下位機,如STM32)

C# (Winform)實現USB HID自定義介面操作(控制下位機,如STM32)

  利用C#(Winform)可以快速地建立一個桌面EXE,實現各種各樣的功能,本文會講述如何建立一個與USB HID裝置通訊的介面。

  眾所周知,如果膝上型電腦要通過USB介面與USB裝置通訊,那麼首先第一步就需要建立USB驅動。而HID裝置可以使用通用的裝置,因此可以省掉HID驅動的開發,而且在使用者端可以做到免驅,在小資料量傳輸的應用中非常重要。

  C#該如何實現呢?首先,我需要介紹一個.dll檔案,“CyUSB.dll”這個檔案為Cypress公司利用C#開發的常用的USB裝置介面檔案,其中就包含了USB HID裝置,關鍵是免費的,因此,我們其實只需要呼叫這個檔案,然後就可以進行一系列操作即可。“CyUSB.dll”檔案地址可以在官網上下載,下載FX3的SDK或者USB Series Configuration Utillity,裡面包含該檔案。

  首先呼叫 CyUSB.dll,在專案引用中新增該檔案,然後直接呼叫。

  下面就是一個例程,對USB HID的插入和拔出Event進行操作,然後還是主動的USB資料的IN OUT操作,見下方例程。

  using System;

  using System.Drawing;

  using System.Windows.Forms;

  using CyUSB; //呼叫CyUSB.dll

  namespace Debug_Tool

  {

  public partial class MainTool : Form

  {

  private USBDeviceList usbDevices=null; //定義USB裝置列表

  private CyHidDevice myHidDevice=null;//定義USB HID裝置列表

  private const int VID=0x0483;

  private const int PID=0x5750;

  public MainTool()

  {

  InitializeComponent();

  USB_Init();

  }

  //USB 插入和拔出Event例項化

  private void USB_Init()

  {

  usbDevices=new USBDeviceList(CyConst.DEVICES_HID);

  //usbDevices陣列儲存著所有插入的USB裝置的資訊,包括我們自己的USB HID裝置資訊。

  usbDevices.DeviceAttached +=new EventHandler(usbDevices_DeviceAttached);

  usbDevices.DeviceRemoved +=new EventHandler(usbDevices_DeviceRemoved);

  Get_Devices();

  }

  //USB裝置插入Event執行

  private void usbDevices_DeviceAttached(object sender, EventArgs e)

  {

  USBEventArgs usbEvent=e as USBEventArgs;

  //Check VID和PID,看是否是我們自己定義的USB HID裝置。

  if ((usbEvent.VendorID==VID) && (usbEventductID==PID))

  {

  //執行USB插入操作,如指示燈變綠,表示裝置插入

  }

  }

  //USB裝置拔出Event執行

  private void usbDevices_DeviceRemoved(object sender, EventArgs e)

  {

  USBEventArgs usbEvent=e as USBEventArgs;

  if ((usbEvent.VendorID==VID) && (usbEventductID==PID))

  {

  //執行USB拔出操作,如指示燈變紅,表示裝置拔出

  }

  }

  private void Get_Devices()

  {

  if ((usbDevices[index].VendorID==VID) && (usbDevices[index]ductID==PID))

  {

  myHidDevice=usbDevices[VID, PID] as CyHidDevice; //例項化 myHidDevice裝置,這樣就可以對USBHID裝置進行IN OUT操作

  }

  }

  //USB HID 裝置 IN操作

  public int receive_usb_data(byte[] data)

  {

  int num=0;

  if (myHidDevice !=null)

  {

  if (myHidDevice.ReadInput())

  {

  num=myHidDevice.Inputs.RptByteLen;

  if (num !=0x00)

  {

  for (int temp=0; temp < num - 1; temp++)

  {

  //myHidDevice.Inputs.DataBuf[0]儲存的是資料長度,這一個資料在我的應用中沒有用到,因此就丟棄掉

  data[temp]=myHidDevice.Inputs.DataBuf[temp + 1];

  }

  }

  }

  else

  {

  //Retry again

  //有的電腦在Sleep之後喚醒,USB的Input第一次會比較慢,需要Retry一次,就是多等一會兒。

  if (myHidDevice.ReadInput())

  {

  num=myHidDevice.Inputs.RptByteLen;

  if (num !=0x00)

  {

  for (int temp=0; temp < num - 1; temp++)

  {

  data[temp]=myHidDevice.Inputs.DataBuf[temp + 1];

  }

  }

  }

  }

  }

  return num;

  }

  //USB HID 裝置 OUT操作

  public bool send_usb_data(byte[] data, int length)

  {

  bool status=false;

  if (myHidDevice !=null)

  {

  myHidDevice.Outputs.DataBuf[0]=myHidDevice.Outputs.ID;

  for (int temp=1; temp <=length; temp++)

  {

  myHidDevice.Outputs.DataBuf[temp]=data[temp - 1];

  }

  status=myHidDevice.WriteOutput();

  }

  return status;

  }

  }

  }

  上面程式碼是一些基本的USB HID裝置操作,當然,還有更多一些USB HID的方法實現,我在這裡就不再贅述,下載CyUSB.dll之後會有User Guide,那裡有比較詳細的方法例程。

  當然,可能我的程式碼寫法上不夠精簡,用法是沒有問題的。分享給大家,希望對大家有用。下面的文章,我會大概簡述一下如何用C# 做一個上位機,對STM32通過USB HID裝置進行Firmware升級(用自己定義的協議格式),當然該STM32需要支援BootLoader。