USB HID 枚举成功,读写不成功

koala98222   2008-7-15 10:24 楼主
网上都说用createfile,Writefile和readfile一步步来。
1.我用writefile返回值为1.表明发送成功。
但是WriteFile( hidDevice, OutputReport,flaglen,&TransBytes, NULL);
其中的flaglen这个参数只能用宏定义的#define flaglen  155L
改成任意别的,writefile的返回值就为0,表明发送不成功了。不知道为什么?

2.在发送成功的前提下,用readfile会进入死循环。
3.在发送成功的前提下,用HidD_GetProductString程序可以执行,但是返回长度都是0
查了USB中的源码,发现用HidD_GetProductString这个函数,就会进入USB中的一个中断处理程序,
还没进入我的命令解析,就直接跳出来了。

这些问题是PC中软件问题还是USB中代码问题啊?

求助啊。。。

回复评论 (8)

2.进入死循环是因为预期收到的数据长度与我预设的长度不符。
但是把长度改成较短的任意数时,就会显示返回错误

但是我还是不知道如何修改程序。
点赞  2008-7-15 10:44
可能内部就是走的控制传输。我还没解析好。
有谁对控制传输流程比较熟的么
点赞  2008-7-18 09:06
大部分的流驱动用控制传输更多一些。

DeviceIoControl(hd, CODE-ID, buffer....)
主要就是这个CODE-ID,是控制指令,必须和驱动中的对应上,比如“读取”,后面参数再设置buffer地址,读取字节数,“写入”,设置buffer,写入字节数。等等。
如果是标准驱动,那么及可以看MSDN,能得到标准支持的控制指令。
如果是非标驱动,需要跟原厂联系,得到其驱动支持的控制指令。
点赞  2008-7-18 12:44
我的是标准驱动。现在枚举和通信都能成功。
但是不知道为什么 控制传输把传输数据分成了两种情况。
1种是< 128byte 这种情况数据和返回值都接受正常。
另一种是 > 128 byte,要分两次发送。第二次发送总是响应不了。。
求助。。。。。。
点赞  2008-7-22 10:18
<128成功,说明那个设备定义的报告长度是128,你发送大于128肯定不会成功。
你说的大于128的情况,首先要看你的设备是不是允许你这么拆分数据,如果设备允许,你检查一下ID是不是正确置上了。
点赞  2008-7-25 17:00

7楼 ojo 

引用: 引用 5 楼 macroz 的回复:
<128成功,说明那个设备定义的报告长度是128,你发送大于128肯定不会成功。
你说的大于128的情况,首先要看你的设备是不是允许你这么拆分数据,如果设备允许,你检查一下ID是不是正确置上了。


上面的问题弄清楚了。是我把端点最大长度和循环接收次数没弄对。

点赞  2008-7-27 14:54
还有一个问题:
主机往设备发送数据(用writefile)
再从设备接收数据(用getproductstring可能记错了)
这个是在两个控制传输中完成还是用一个就可以完成?

看USB协议说,在一个控制传输的数据阶段可以有多个In或者Out的事务处理过程。
这个多个数据事务处理过程,是指数据很长,需要分多次传输?ao
还是指可以先进行Out传输,然后接着在进行IN传输?只要每次i传的数据长度都是端点最大长度就行了?

迷惑啊。。
点赞  2008-7-27 15:00
引用: 引用 7 楼 jszln1127 的回复:
再从设备接收数据(用getproductstring可能记错了)

这个命令还是应该改为 HidD_GetProductString
点赞  2008-7-27 15:02
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复