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。

上一篇:Windows下UAC音频设备调试


下一篇:STM32MP157开发笔记 | 02 - STM32MP157C-DK2公板快速上手