本文章介绍了如何在C#编程语言中实现与HID(人体接口设备)USB设备之间的通讯,详细讲解了相关的代码示例和开发技巧。
编写源代码并使用VS2010与Framework3.5开发工具来读取或操作HID USB设备的案例在网络上广泛存在,但大多数示例直接复制粘贴后无法正常工作。这些例子通常围绕着`public static extern int CreateFile(...)`函数展开。然而,如果你尝试运行它们会发现大部分都无法成功访问硬件设备。
原因很简单:Windows系统默认不允许程序随意地去读取或写入外接的USB HID设备。因此,在此我整理并分享一个基于C#开发、用于读写HID USB设备的小案例,该案例在VS2010环境下运行良好。重点在于`public static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess, int dwShareMode, IntPtr lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile);`函数的使用上,注意到返回类型是SafeFileHandle,这就解决了Windows系统对设备访问权限的问题。
接下来是如何运用该案例的具体步骤:
1. **获取HID USB 设备信息**:
```csharp
List slist = new List();
UsbHidDevice usbhid = new UsbHidDevice();
usbhid.GetDeviceList(ref slist);
```
2. 从设备信息中提取VID和PID,例如:`\\?\hid#vid_0e2c&pid_0112#6&1b44c403;&0&0000;#{4d1e55b2-f16f-11cf-88cb-001111000030}`,其中`vid= 0e2c, pid = 0112`
3. **创建HID USB设备实例**:
```csharp
UsbHidDevice Device = new UsbHidDevice(vid, pid);
```
4. 连接设备:
`Boolean connBool = Device.Connect();`
5. 实现数据接收事件处理程序,当收到USB HID设备的数据时触发该方法:
```csharp
void Device_DataReceived(byte[] data)
{
// 处理返回的字节流逻辑
}
// 注册事件处理器
Device.DataReceived += new UsbHidDevice.DataReceivedDelegate(Device_DataReceived);
```
6. 向设备发送数据:
```csharp
string txt = 0xa0 00 0x12 0x9 0x22;
byte[] data = ConvertHelper.StringToByte(txt); // 转换为字节数组
CommandMessage cmdMsg = new CommandMessage(bt, data);
Boolean sbool = Device.SendMessage(cmdMsg);
```
7. 当完成所有操作后,释放资源:
```csharp
Device.Dispose();
```
通过以上步骤可以顺利地使用C#在VS2010环境下开发HID USB设备的读写应用。