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。