硬件:带有usb测试固件的lpc1549评估板...
endpoint size 64字节endpoint intr读出-report buf并以十六进制显示len和数据...将out_report复制到in_report buf中,并使用写入函数和len回显
主机:
使用qt5、libusb-1.0.19 wingw32 dll和hidapi代码
hid测试代码在linux、win7和win8.1中成功地发布了所有的api调用(写和读除外)。
在linux中,测试代码先是hid_write,然后是hid_read,然后正确返回数据
我没有使用由hidapi hid_write强制标记的报告ID,因为恩智浦固件和keil软件不使用它(据我所知) ...我的linux软件正确地发送和接收已定义的64字节模式或更小的len),byte是此模式的一部分...输出字节数据和输入字节数据故意不同且正确接收
在windows下运行keil hid客户端成功地与lpc1549固件进行了正确的通信,即使它们只传输和回显一个字节...
我的固件将端点大小更改为64字节(我希望我的更改是正确的),并且keil hid客户端可以在windows中使用它,因此我的假设是我的描述符是正确的……但愿能去
主机软件kububtu 14.04 hid_write len = 17,设备17字节已收到,17字节表示已收到...一切似乎都工作正常。
win 8.1 hid_write中包含hidapi的主机软件len = 17字节显示在设备上,其中16字节正确,其余为0,但读取指示接收到的len为64...我发出了一个写为17,正确地收到了16,但显示为64收到也win 8.1抛出一个空白的system32/cmd提示符窗口...为什么?
同样的情况也挂在win7上,只有hid_write len =0成功...正在弹出相同的命令提示...收到len = 64,但未传输数据(因为len =0才有意义)
我不能单步执行或断点,因为qt调试器get在应用加载时出现段错误
另外,我在我的qt应用程序中链接到hidapi“windows/id.c”代码,它现在是我的代码的一部分。
很抱歉,我的描述相当复杂
如果没有使用报告ID,为什么它是必填项...这将浪费一个字节,并且如果需要uint32_t对齐,则将浪费大约7%的64字节数据
为什么用c++ msvs编写的keil hid客户端与我的固件和hidapi不能正常工作?
keil hid客户端的运行是否表明我的固件、描述符和报告len是正确的?
什么会导致弹出空的命令提示符?
我可能做错了什么(一个完整的基于hidapi的应用程序可以正确地与一个完整的基于usb的固件pgm通信,而不仅仅是描述的测试代码)?
发布于 2015-07-28 13:31:42
几天后,有几件事弄清楚了。
ReportID似乎是windows中的东西,而且只在主机端...固件在我的设置中不受影响
此外,最初没有清除的是,ReportID是对最大64个报告字节的补充
所以我创建了一个1+ 64字节= 65的缓冲区...第一个是零,因为我没有使用ReportID机制,剩下的64个通常使用
因此,无论usb hid描述符端点侧的reportsize是什么,写调用数据大小都需要是1+
在linux中,我所看到的hid上没有ReportID。
下一步:确保在主机以及设备上的write调用中指定的数据长度与端点大小定义完全匹配,否则数据不会通过这两个方向,并且您的软件可能会挂起(永远等待)另一端的读取
我希望这能帮助其他人更好地了解hidapi hid_write调用的windows端。
发布于 2015-07-29 01:38:25
Alan Ott给我写了以下内容
http://www.signal11.us/oss/hidapi/hidapi/doxygen/html/group__API.html#gad14ea48e440cf5066df87cc6488493af
报告ID是固定存在的,在HIDAPI中必须始终发送报告ID,但如果报告ID为0,则不会发送到设备。
https://stackoverflow.com/questions/31620814
复制相似问题