从C或C ++的USB设备接收数据

我需要列出所有插入的USB设备,并让用户select一个让控制台应用程序接收USB设备发送的任何数据。

然后,我可以开始玩我的程序中的数据。

我不想使用库的,只有标准的C ++函数,程序应该在Windows 98中工作。

Solutions Collecting From Web of "从C或C ++的USB设备接收数据"

这是论坛和编程Q + A站点的一个非常持久的问题。 从来没有一个快乐的结局。 USB中的B表示总线。 这是计算机硬件设计中描述电子设备交换数据的电气接口的术语。 它的作用与你机器内部的PCI(快速)总线完全相同。 由于首先是电气规格,USB支持大量类型的设备。 任何从无线网络适配器,调制解调器,闪存卡到茶壶加热器。 只有那些处理不好的设备才是需要很大带宽的设备,比如视频适配器。

USB规范有一个非常优雅的协议规范,描述设备如何共享总线以及如何交换数据。 然而,该协议规范并没有描述数据的格式,只是定义了能够传递字节块的概念。 这是由设备本身给这些字节的含义。

在机器端,你需要软件来解释这些字节,并使机器做一些有趣的事情。 这需要一个设备驱动程序。 就像您的视频卡和网络接口卡需要设备驱动程序一样。 显然,视频驱动程序与网卡驱动程序非常不同。 USB驱动程序也是如此,通用性不大。

如果你想编写对待USB设备类似的软件,那么你需要在它们仍然有共同点的地方编写这个软件。 在USB控制器级别,您可以编写一个筛选器驱动程序,将其注入到USB驱动程序堆栈中,并查看控制器和设备驱动程序之间的I / O请求数据包。 类似于对TCP / IP通信进行监视的winpcap过滤器驱动程序。 没有什么有趣的东西可以看到,但是你会盯着来回传递的字节。 这是一个比winpcap更大的问题,至少它看到的字节飞行的意思是在RFC的某处。 USB的情况并非如此,制造USB设备的公司通常也是设备驱动供应商。 他们保持内部格式无证。

编写过滤器驱动程序需要相当先进的技能,有很多痛点。 当你犯了一个简单的错误就像崩溃的操作系统。 最近Windows Driver Model也有相当大的变化,USB驱动程序已经进入第三环(用户模式),以保持操作系统的稳定。

要开始,请下载Windows WDK(又名“DDK”)并阅读Walter Oney的书籍。 最好全部。

一个人怎么能写一个USB的程序,想了解它的背景,而不想多读一下,不想用库,都在同一时间? 无论如何。 有一个Stefan Meyer的项目“libUSB Win32”目前还没有大量开发,但是用C语言编写,也许这对你来说可能是有用的,它也能在古代windows版本下运行;)你可以在这里找到它:
http://sourceforge.net/apps/trac/libusb-win32/wiki
前一段时间我已经在VB6中写了这个使用“libUSB Win32”的不知道它是否对你有用:
http://www.activevb.de/cgi-bin/upload/download.pl?id=3061

这里有一些让你开始的东西:

  • 通用串行总线版本3.0规范 – 它有点长,但是如果你想进入USB就是一个很好的阅读。 它解释了USB如何工作的一切。
  • MSDN的USB部分

而对于一个不是来自千禧年的操作系统,大声地更新。 我听说Linux对USB有很好的支持。

我只需要列出所有插入的USB设备,并让用户选择一个让控制台应用程序接收USB设备发送的任何数据。

获取列表不是大问题,它正在接收数据。

我知道你不想写驱动程序,但这是驱动程序所做的:从设备接收数据。

添加一些很好的答案…

USB编程不是“琐事”

首先,你必须了解操作系统是如何工作的,为什么他们有驱动程序。

除非你想在DOS下编程一个RS-232端口,否则你不能直接与USB端口通信,你必须与操作系统和你感兴趣的设备的驱动程序进行通信。

你在这里得到的建议是关键的。 USB是不容易的,相信我…我正在从事USB项目,但从后端。 在我看来,你也需要考虑后端,那就是你根本不需要和图书馆打交道,但是不管你做什么,你都无法绕过阅读。

不要气馁,但是在你跳入和被淹死之前,你确实需要弄湿你的脚。 USB2.0和USB3.0相当干燥,但我发现OSDev Wiki和usbmadesimple是有用的垫脚石。

如果你仍然需要在PC上,那么你应该考虑尝试获得一些开放源码的USB代码,如果你可以找到USB嗅探器。