利用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。