请版主和高手们关注---USB通讯程序中遇到的高难度问题

junki 2005-05-17 08:59:43
我现在正在进行编程测试,主要是实现应用程序与EV2300(TI公司产品)的USB设备通讯。
据了解,USB设备驱动由TI厂商自己开发的(我们无法得到它的技术资料),从应用角度很难明白通讯的实质;
并非像HID类型USB设备,直接调用系统API函数就可以实现的。

从网上获取了一些USB应用开发的信息,我们写了一个测试程序,发现
存在许多问题,请指导:
1. 如何获取GUID信息,在INF文件中并没有包含此信息,只有VendorID=0451,ProductID=0035,是不是每个USB设备都对应不同的GUID,而它是打开USB设备的唯一途径;很多人都是从注册表中获取的,有没有可能通过程序实现呢?

2. 在获得GUID之后,就可以得到设备路径,主要通过系统API函数实现:
SetupDiGetClassDevs,SetupDiEnumDeviceInterfaces,SetupDiGetDeviceInterfaceDetail
得到的设备路径DevicePathName,是否要在其后面加上pipe0,1,2对应于通讯所使用的通道?

3. USBHandle = CreateFile _
(DevicePathName, _
GENERIC_READ Or GENERIC_WRITE, _
(FILE_SHARE_READ Or FILE_SHARE_WRITE), _
Security, _
OPEN_EXISTING, _
0&, _
0)
打开设备时,有时成功,有时失败,得到"请求的资源正在使用中"错误信息,是不是CreateFile 参数的
问题?

4. 最关键的错误
Result = WriteFile(USBHandle, _
WriteBuffer(0), _
CLng(Capabilities.OutputReportByteLength), _
NumberOfBytesWritten, _
0)
Result返回为0,写数据没有成功,不知道为什么?也不明白WriteBuffer(0), 和Capabilities.OutputReportByteLength
的含义。调试了很久,也找不到原因,现在都是火烧眉头了,一下子好像掉进了泥陷中,举步维履。

由于我们对USB设备开发不甚了解,一切都还是摸索,探讨中,恳请您的帮助,万分感谢!
...全文
487 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
doubledog 2005-06-08
  • 打赏
  • 举报
回复
到www.8dragon.com下载USB在线检测程序。可以借鉴!
crazytan 2005-06-07
  • 打赏
  • 举报
回复
首先申明我不是高手,以下是我的一些理解,如果有错误请大家指正

1.关于GUID。我们说一个USB设备,如USB Modem, USB表明了设备使用的总线类型,而modem表明了这
个设备的功能,所以这是两个层面。因此就会有这钟现象:USB Modem属于Modem类,USB摄像头(Webcam)
属于Image类等。定位一个USB设备可以通过 设备所属的类GUID + VID_PID

2.在Win32系统里面,设备一般都是抽象为文件,应用程序与驱动程序的通信一般是通过文件操作的API,
CreateFile,ReadFile等

3.打开设备的函数CreateFile,其中最重要的参数是文件路径,也就是设备路径,所以关键就是如何找
到设备的路径,方法就是通过楼主所列举的那几个SetupDiX函数。应用程序是跟驱动程序这个整体通信,
而具体通信的通道应该在驱动程序里面处理

4.通过试加猜去了解黑盒子里面的东西是痛苦的
捕鲸叉 2005-05-26
  • 打赏
  • 举报
回复
1.一般来说,不同的设备驱动有不同的GUID,对于别人的驱动,好象只能从注册表里读了.
2.不知道
3.同楼上
4.如果USB设备的驱动没有写IRP_MJ_WRITE例程,你这种方法是永远不会成功的.(我写的几个USB驱动都属于这种情况)
red-fly 2005-05-22
  • 打赏
  • 举报
回复
我刚开始看usb开发的书,也是一头雾水,以下为个人观点,仅供参考:

1. 书上说要从注册表中读取。其它的我就不太清楚了
2. 是否要加上通道号码,我想这个比较容易,你读取之后,看读出的结果是否有通道号码,如果没有,你就把它加上去。(好笨呀)
3. 应该是程序的问题。比如过去打开,但没有关闭。或者关闭了,但硬件还没有“关闭”
4. WriteFile(
HANDLE hFile, // handle to file to write to
LPCVOID lpBuffer, // pointer to data to write to file
DWORD nNumberOfBytesToWrite, // number of bytes to write
LPDWORD lpNumberOfBytesWritten, // pointer to number of bytes written
LPOVERLAPPED lpOverlapped // pointer to structure for overlapped I/O
);
后两个可以是NULL,也可以是指针,但是用NumberOfBytesWritten不是指针,恐怕是不行的吧,你就在其前面加上个“&”。不知道你的WriteBuffer(0)是个什么类型,如果不是一个指向要写入的数据的指针,我真猜不出其结果会是什么
xift_2008 2005-05-21
  • 打赏
  • 举报
回复
WriteBuffer(0)中的0是什么,不会写buffer是空的吧?
Capabilities.OutputReportByteLength应该是需要写
的数据长度吧,即WriteBuffer中实际的数据长度。
lcstudio 2005-05-19
  • 打赏
  • 举报
回复
USB驱动层不是用CreateFile,WriteFile这样的高级系统调用来操作的.那个CreateFile得到的句柄只能针对USB层的一些状态做ioctl.
ppcust 2005-05-19
  • 打赏
  • 举报
回复
最好能知道,他下面的固件是怎么写的,这样才好找错误,,

现在你是单方面看上层的,,好象不好做,,,


你不知道下面是干吗的,就给别人下命令,,别人当然不听了啊
wut55 2005-05-18
  • 打赏
  • 举报
回复
1、USB设备的GUID应该是一样的,也就是统一的,只要在INF文件里的class = USB;
2、WriteFile的说明你应该看看MSDN;在WriteFile后面调用GetLastError()看返回什么错误。
3、至于如何打开USB设备,我没玩过,不清楚。
newzk 2005-05-18
  • 打赏
  • 举报
回复
不知道你的设备是否支持WIA,若支持,你可下载xp sdk
junki 2005-05-17
  • 打赏
  • 举报
回复
怎么没有人回答?
今天放在硬件驱动版,VC版也没有人回答

哎,难道高手都在潜水吗?

UP者都有分,提出有建议性话的,给高分。。
DooDu 2005-05-17
  • 打赏
  • 举报
回复
高级问题,帮up
mysq 2005-05-17
  • 打赏
  • 举报
回复
帮你UP,学习!

21,600

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧