hidapi Windows 8.1 hid_write失败

时间:2015-07-24 22:36:46

标签: qt5 libusb-1.0 hidapi

hw:lpc1549 eval board with usb hid test firmware ...

端点大小为64字节 端点intr读取out-report buf并以十六进制显示len和数据... 将out_report复制到in_report buf中,并使用write funct和len

回显

主持人:

使用qt5,libusb-1.0.19 wingw32 dll和hidapi代码

hid测试代码在linux,win7和win8.1中成功发出所有api调用(写入和读取除外)

测试代码发出hid_write后跟hid_read并在linux中正确获取数据

我没有使用hidapi hid_write强制标记的报告ID,因为nxp固件和keil软件不使用它(据我所知)... 我的linux sw正确地发送和接收定义的64字节模式或更小的len)并且byte [0]是此模式的一部分... out和in byte [0]数据有意地不同且接收正确

在Windows下运行keil hid客户端成功与lpc1549固件正常通信,即使它们只传输并回显一个字节......

我的固件的端点大小已更改为64字节(我希望我的更改是正确的),并且keil hid客户端在Windows中使用它,所以我的假设是我的描述符是正确的...希望

host sw kububtu 14.04 hid_write len = 17,设备收到17个字节,17个字节表示收到...所有似乎都正常工作

在胜利8.1中主持sw与hidapi hid_write len = 17字节显示在16字节正确的设备上,其余为0,但读取表明收到的len为64 ...我发出了17的写入,正确接收16,但被指示为64接收 也赢了8.1抛出一个空白的system32 / cmd提示窗口......为什么???

同样在win7上挂起,只有一个hid_write len = 0成功...弹出相同的cmd提示...收到len = 64,但没有传输数据(因为它对len = 0有意义)

我无法单步执行或断点,因为qt调试器在应用加载时出现段错误

我也将我的qt应用程序链接到hidapi" windows / hid.c"代码,它现在是我的代码

对不起我的相当复杂的描述

为什么报告ID是强制性的,如果它没有被使用...这将浪费一个字节,如果需要uint32_t对齐,那将浪费大约7%的64字节数据< / p>

为什么keil隐藏用c ++ msvs写的客户端能正常使用我的fw和hidapi

keil hid客户端的功能是否表明我的fw和我的描述符和报告len是正确的

什么会导致空cmd提示弹出?

我可能做错了什么(基于hidapi的整个应用程序正确地与完整的基于usb的固件pgm进行通信,而不仅仅是描述的测试代码)?

2 个答案:

答案 0 :(得分:0)

几天后,有几件事情变得清晰了

ReportID似乎只是Windows和主机端的东西......固件不会影响我的设置

最初还没有明确的是ReportID是最多64个报告字节

的补充

所以我创建一个1 + 64字节= 65的缓冲区...第一个是零,因为我不使用ReportID机制,其余64个通常使用

因此,写入调用数据大小需要为1 +,无论报告大小是否在usb hid描述符端点侧

在Linux中,没有关于隐藏我能看到的内容的ReportID

next:确保主机上的write调用中指定的数据长度以及设备上的数据长度与端点大小定义完全匹配,否则任何方向都没有数据,并且您的软件可能会在读取时挂起(等待永远)另一端

我希望这可以帮助其他人更好地了解hidapi hid_write调用的windows结尾

答案 1 :(得分:0)

Alan Ott给我写了以下内容

http://www.signal11.us/oss/hidapi/hidapi/doxygen/html/group__API.html#gad14ea48e440cf5066df87cc6488493af

始终有报告ID。您必须始终在HIDAPI中发送报告ID,但如果报告ID为0,则不会将其发送到设备。