jackadandy
驱动牛犊
驱动牛犊
  • 注册日期2004-03-04
  • 最后登录2016-01-09
  • 粉丝1
  • 关注1
  • 积分5分
  • 威望30点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
阅读:2414回复:7

老问题:不能向hid发报表。几个函数都不行。分析一下!

楼主#
更多 发布于:2005-04-30 10:36
已经正确地找到设备路径和句柄,但向设备发报表时,用bus hound监测不到。老实发不下去,怎么回事啊!
我用的是HidD_SetFeature(fd,OutPutReport,0x05);试了一下,不行。然后我换writefile还是不行。
在用writefile时,
WriteFile(fd,OutPutReport,Capabilities.OutputReportByteLength,&BytesWritten,NULL);
中的Capabilities.OutputReportByteLength的值为0,不知道怎么回事,后来我换成自己设定的outputreport的值也不行。
本来想再用hidd_setinputreport试一下,可总是出现error LNK2001: unresolved external symbol_HidD_GetInputReport@12。也没找出毛病在哪。

希望大家能帮帮忙,谢谢!!应该用哪个函数啊,他们在传输报表时的格式有区别吗?

另外:最后结贴时怎么给你们分啊?找不到给分的地方。
fisher02
驱动牛犊
驱动牛犊
  • 注册日期2004-05-13
  • 最后登录2008-04-23
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-04-30 10:44
你其中 OutputReportByteLength 值应该是你ubs 报告描叙包大小的值加1。
jackadandy
驱动牛犊
驱动牛犊
  • 注册日期2004-03-04
  • 最后登录2016-01-09
  • 粉丝1
  • 关注1
  • 积分5分
  • 威望30点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-04-30 10:57
改了也不行。
另外问一下:Capabilities.OutputReportByteLength有什么意义啊,他得知要通过好几个api调用才能得到。而函数writefile中第三个参数设成outreportlength+1就可以了,为什么还要调用函数HidD_GetPreparsedData(),HidP_GetCaps()来得到Capabilities.OutputReportByteLength哪,而且我得到的他得知都是零,键盘的是2。
Descriptor
驱动牛犊
驱动牛犊
  • 注册日期2005-03-13
  • 最后登录2006-01-19
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-04-30 13:30
教你如何给分
打开主题后,列出所有的帖子,第一个是你楼主的。此栏中有\"给分\",按一下,剩下的就是你的事了。
zhaobeishengcoo
驱动牛犊
驱动牛犊
  • 注册日期2004-02-25
  • 最后登录2005-05-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-05-05 21:21
HID 设备 如果要输入输出的话
除控制端点外,一般 只需要一个端点。
而且这个端点是中断IN端点。这个端点是用于输入数据到主机的。
其余的端点就闲置不用了。

而输出数据到设备,有两种方式可选择;
一种是通过控制端点,传输到设备
一种是通过中断OUT端点,传输到设备。

第一种方法是通过控制传输,传输到设备
第二种方法我没有试过。但资料上说,如果要用这种方法,需要一个额外的OUT端点。

读写设备用的API为WriteFile和ReadFile
没有必要按照DDK上所说的一步步调用那些函数
找到设备路径后,打开设备句柄就可以对设备进行读写了。

至于到底用那个端点好像都没有限制。
感觉端点只是一个数据缓冲区。

如果传输数据的量小于60
也就没有必要将 端点描述符中的 wMaxPacketSize 设置为60
设置为传输数据包的大小就可以了。

应用程序设置的缓冲区 的第一个字节为 报告描述符的索引。
如果没有多个报告描述符,则清零
后面的才是输入输出描述符的存储区域
所以缓冲区比输入输出描述符多一个字节
并且在首次使用之前要用ZeroMemory清零

设备描述符部分可参考 http://www.driverdevelop.com/forum/viewthread.php?tid=91329
zhaobeishengcoo
驱动牛犊
驱动牛犊
  • 注册日期2004-02-25
  • 最后登录2005-05-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-05-05 21:47
还有 找到的设备路径的形式应该是 HID×××××××
而不是USB×××××××××××

如果用BusHound监视的话,
选择正确的设备。

因为HID设备在设备管理器里面
一个设备 在USB下面有个显示,在HID下面也有显示。

其实只要设备打开了,通过writeFile发出写命令

在BusHound中,是肯定能监视到的。
此时在VC中Debug就可以查看问题到底出现在哪里



[编辑 -  5/6/05 by  zhaobeishengcool]
zhaobeishengcoo
驱动牛犊
驱动牛犊
  • 注册日期2004-02-25
  • 最后登录2005-05-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-05-06 10:54

//清缓冲区
ZeroMemory(reportInBuffer, 3);
ZeroMemory(reportOutBuffer, 3);
m_hdevice=NULL;

//打开设备  设备路径 我直接用winobject查看得到
m_hdevice=CreateFile(\"\\\\\\\\?\\\\hid#vid_1234&pid_5678#6&3364b7cd&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}\",
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

//写数据
DWORD numoftxdata;
reportOutBuffer[0]=0;
reportOutBuffer[1]=8;
reportOutBuffer[2]=9;
WriteFile(m_hdevice,reportOutBuffer,3,&numoftxdata,NULL);

//读数据
DWORD numofrxdata;
ReadFile(m_hdevice,reportInBuffer,3,&numofrxdata,NULL);
jackadandy
驱动牛犊
驱动牛犊
  • 注册日期2004-03-04
  • 最后登录2016-01-09
  • 粉丝1
  • 关注1
  • 积分5分
  • 威望30点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-05-08 16:36
已经搞定了。
是硬件的问题。
现在通了。
给分!!
游客

返回顶部