网站首页 > 技术文章 正文
利用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) && (usbEvent.ProductID == PID))
{
//执行USB插入操作,如指示灯变绿,表示设备插入
}
}
//USB设备拔出Event执行
private void usbDevices_DeviceRemoved(object sender, EventArgs e)
{
USBEventArgs usbEvent = e as USBEventArgs;
if ((usbEvent.VendorID == VID) && (usbEvent.ProductID == PID))
{
//执行USB拔出操作,如指示灯变红,表示设备拔出
}
}
private void Get_Devices()
{
if ((usbDevices[index].VendorID == VID) && (usbDevices[index].ProductID == 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。
猜你喜欢
- 2024-09-11 Tcp服务端一直sleep,客户端不断发送数据产生的问题
- 2024-09-11 C#中的进程与线程及其并发编程(c#多线程并发处理)
- 2024-09-11 在服务中默默地执行C#业务代码(在服务中默默地执行c#业务代码)
- 2024-09-11 C#中AutoResetEvent和ManualResetEvent使用场景
- 2024-09-11 C# AutoResetEvent 和 ManualResetEvent 在 WinForms 应用中的使用
- 2024-09-11 C#基础 DateTime详解(c# datetime.date)
- 2024-09-11 C# 面向对象 静态类和静态成员(c# 静态方法和实例方法)
- 2024-09-11 C#编程中如何使用线程(c#线程是什么)
- 2024-09-11 一篇文章搞懂C#中的接口(c#中接口怎么使用)
- 2024-09-11 C#高精度Timer和Delay以及时间测量
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)