阅读:2414回复:7
老问题:不能向hid发报表。几个函数都不行。分析一下!
已经正确地找到设备路径和句柄,但向设备发报表时,用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。也没找出毛病在哪。 希望大家能帮帮忙,谢谢!!应该用哪个函数啊,他们在传输报表时的格式有区别吗? 另外:最后结贴时怎么给你们分啊?找不到给分的地方。 |
|
沙发#
发布于:2005-04-30 10:44
你其中 OutputReportByteLength 值应该是你ubs 报告描叙包大小的值加1。
|
|
板凳#
发布于:2005-04-30 10:57
改了也不行。
另外问一下:Capabilities.OutputReportByteLength有什么意义啊,他得知要通过好几个api调用才能得到。而函数writefile中第三个参数设成outreportlength+1就可以了,为什么还要调用函数HidD_GetPreparsedData(),HidP_GetCaps()来得到Capabilities.OutputReportByteLength哪,而且我得到的他得知都是零,键盘的是2。 |
|
地板#
发布于:2005-04-30 13:30
教你如何给分
打开主题后,列出所有的帖子,第一个是你楼主的。此栏中有\"给分\",按一下,剩下的就是你的事了。 |
|
地下室#
发布于: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 |
|
5楼#
发布于:2005-05-05 21:47
还有 找到的设备路径的形式应该是 HID×××××××
而不是USB××××××××××× 如果用BusHound监视的话, 选择正确的设备。 因为HID设备在设备管理器里面 一个设备 在USB下面有个显示,在HID下面也有显示。 其实只要设备打开了,通过writeFile发出写命令 在BusHound中,是肯定能监视到的。 此时在VC中Debug就可以查看问题到底出现在哪里 [编辑 - 5/6/05 by zhaobeishengcool] |
|
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); |
|
7楼#
发布于:2005-05-08 16:36
已经搞定了。
是硬件的问题。 现在通了。 给分!! |
|