2010-06-14 48 views
2

我知道这可能不是最简单的事情,但我试图用USB连接微控制器和PC。我不想使用内部USART的微控制器或USB到RS232转换,其项目,以帮助我了解各种原则。因此,从微控制器端完成通信是小菜一碟 - 我的意思是,当我知道他的协议时,它很容易在Micro上实现,因为我直接控制了evrything,甚至是精确的时序。从Windows控制USB

但这不是PC的情况。我对Windows处理连接设备的概念不是很熟悉。在我之前的一个问题中,我询问Windows如何通过驱动程序与设备协同工作。我明白,对于Windows的内部使用,驱动程序必须具有一些可用于OS的默认功能集。我的意思是,当操作系统要访问硬盘驱动器时,它会调用硬盘驱动器(可能是操作系统内部的硬盘驱动器),并带有特定的“问题”,这意味着硬盘驱动器必须写入与Windows配合才能具有写入功能由操作系统调用的地方。与GPU相似,即使DirectX,我的意思是DirectX必须调用驱动程序的特定功能,所以驱动程序必须写入与DX一起工作。我知道,WinAPI的许多功能都是独立工作的,但即使是“简单”窗口也必须写入帧缓冲区,使用MMIO来驱动程序指定的地址。我对吗?

所以,我预计Windows有内部功能,WinAPI的部分设计用于某些共同使用的东西。致电制造商设计的驱动程序。但这似乎并非完全正确,因为Windows无法通过Paralel端口进行通信。我的意思是,WinAPI没有使用串行端口的功能,但是有硬盘,GPU等功能。

但是现在出现了我非常失落的部分。所以,我认为Windows必须具有一些通过USB进行通信的内置功能,例如它可以处理USB闪存。那么,是否有任何WinAPI功能可以让用户通过该功能操作USB,或者当我想自己使用USB时,是否必须自己调用所需的USB驱动程序功能?所有你需要发送到USB控制器的设备地址和信息权利?我的意思是,我不需要写任何新的驱动程序,对吗?如果有这种情况,只需调用WinAPI函数,或直接调用原始USB驱动程序。这是否有任何意义?

回答

1

为了让您的生活更轻松,避免编写自己的驱动程序,请尝试在USB之上使用HID(人机界面设备)API。虽然它说“人机界面”,但实际上并不一定适用于人为控制的设备。优点是现代操作系统已经配备了HID驱动程序,您可以使用示例代码,例如您可以找到here以开始使用。许多微控制器制造商为协议的嵌入提供了合适的代码。

由于操作系统已经了解HID,如果您使用HID接口构建设备,您会发现不仅可以从任何操作系统读取设备,还可以发现许多应用程序已经可以与您的设备通话通信仅限于HID的足够小的子集。 (例如,我为音乐应用程序构建了一个输入设备,但令人惊讶的是,我发现我可以直接将其插入到我们在工作中使用的3D动画应用程序中,运行在不同的操作系统上,并立即开始工作,无需编写一个单一的额外的代码行!)

+0

嗨,谢谢,我还可以有一个问题吗?如果我做对了,HID实际上是与USB驱动程序通信的WinAPI部分,但USB驱动程序仍然必须具备向设备发送数据和向后发送数据的能力。那么我可以直接寻找USB驱动吗?我从来没有用过C标准库,WinAPI或.net类以外的东西。 – 2010-06-15 20:34:00

+0

应该已经安装了知道如何处理所有事情的HID驱动程序。 (我的经验不是在Windows上,不幸的是,我做了一些Google搜索。第13章[这里](http://proyectosfie.com/html/usb/libro/)是关于Windows上的HID的。)我认为你不需要知道司机的任何事情,除了有一个礼物。 – sigfpe 2010-06-15 21:23:23

+0

谢谢。我可以有更快的问题吗?比方说,我有USB摄像头,我希望它能与一些设计用于网络摄像头的WinAPI功能一起工作。 (即使没有,它的正义理论)所以,我会在WinPAI和一些通用USB驱动程序之间编写一些翻译程序(只需调用USB驱动程序的send()函数),还是必须在驱动程序中写入整个USB通信?我的意思是所有与USB控制器的通信? – 2010-06-16 09:11:55

0

USB包含一组库存功能,非常类似于支持USB闪存驱动器(USB Mass Storage class)。微控制器接口的两个最有趣的是HID和CDC。 CDC最容易使用,因为它直接模拟旧式串行端口。

如果将微控制器配置为CDC设备,则Windows会将其列为串行端口,并且所有旧的串行API都可以使用它。