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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM