65.9K
CodeProject 正在变化。 阅读更多。
Home

C# USB HID 接口

starIconstarIconstarIconstarIconstarIcon

5.00/5 (64投票s)

2013年1月20日

CPOL

5分钟阅读

viewsIcon

493100

downloadIcon

36663

对理解 HID 设备与 C# 之间通信的另一种方法。

引言

这篇文章是我的一点小小贡献,旨在让那些想要与 HID 设备接口的人的生活更轻松一些。

背景

我之所以涉足这个领域,是因为我业余时间玩过 microchip 的 PIC 芯片,最近发现其中一些芯片可以成为 USB 设备,但我找不到任何易于理解的 C# HID 接口。我不喜欢直接下载和使用现成的库,我更喜欢真正理解正在发生的事情。我研究了一些现有的例子和库,总是发现要么缺少这个功能,要么缺少那几个功能。

我的库需要的一些功能,举几例如下:

  1. 模块化 - 可以插入任何框架和/或应用程序,并且每个功能都可以单独控制,即:设备移除通知可以关闭或忽略。
  2. 可读性 - 代码必须足够清晰,让我不必去琢磨它到底在做什么。
  3. 简洁性 - 我并不真的希望它成为一个现成的插件,我更希望它是一个良好/稳固的起点,可以从中派生出任何东西。我在网上找到的一些其他例子充斥着为最初设计的应用程序做特定事情的函数,自动地用可能不相关的东西污染了库本身,或者更糟的是,干扰了它在其他应用程序中的使用。通常,那些特定于应用程序的代码是类本身的一部分,如果你想理解它,它会使代码更加混乱。不过,如果你可以用几句话概括某件事,何必写一篇长篇大论呢。
  4. 与设备进行真正的实时通信。或者说,尽可能真实的实时通信。一些其他例子缺乏这个选项,它们基于计时器从设备读取状态/消息。对我来说这是不可接受的。如果设备想立即告诉我什么,我希望立即知道,所以这个类创建了一个独立的线程,专门处理传入的消息。
  5. 稳定性 - 我发现的一些其他例子只有在没有发生意外情况时才能正常工作。例如,如果我移除了设备,类就会挂起应用程序或以其特有的方式崩溃。这对我来说再次是不可接受的,所以我尽我所能地干净地处理异常情况。

我必须说,这段代码大部分是“借用”自我研究过的所有其他示例,而且它们实在太多了,不可能将所有注释或文件头都复制/粘贴到这个里面。如果您以前制作过一个类似的类并将其发布到某个地方,您可能会发现其中一些代码块直接复制自您的。我无意窃取您的代码或违反您可能与您的代码一同设置的任何许可/条件。归根结底,我认为如果我需要打开一个文本文件并阅读它,我可能会自己写一个函数,或者从网上第一个结果中快速复制一个,以节省时间,但无论它是否来自您编写的文件,函数都会看起来一样,因为它只是文本文件读取。如果您觉得我窃取了您的东西,并且我确实需要在代码中添加注释说明它来自您的文件,请联系我,我将很乐意这样做,但目前我更专注于其功能性而不是法律合规性。

从我的角度来看,从我发布这个类的那一刻起,请随意按原样使用它,从中派生,提取您感兴趣的或您可能觉得有用的代码块,或者从中尽可能多地学习,而无需对我承担任何义务,甚至提及我参与其中。尽情享受吧,如果您觉得它有用,我将很高兴。

我确实要提到,主要的灵感和大部分“借用”的代码来自 Simon Inns 的一个框架,来自:http://www.waitingforfriday.com/


应许多请求,我决定整理一个可用的示例。

我将从一个基于 PIC18f2550 的最小 USB 通信电路原理图开始。

以及制作的原型

我还会附上芯片的源代码和编译后的 hex 文件,使用 MPLAB 8.90 和 C18 编译器 v3.45 编写,这是当时最新的版本。

给芯片编程并将其插入 USB 端口后,我看到了以下效果:

之后,我启动了下面的 Visual Studio 小应用程序(链接在下方),每次点击按钮,PIC 都会回复,替换发送消息的前四个字节。

希望这有帮助。

谢谢。

© . All rights reserved.