1

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.19wingw32 dll 和 hidapi 代码

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

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

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

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

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

主机 sw kububtu 14.04 hid_write len = 17,设备收到 17 个字节,17 个字节指示已收到...一切似乎都正常工作

win 8.1 hid_write len = 17 bytes 的主机 sw 显示在设备上,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 对齐,这将浪费大约 64 字节数据的 7%

为什么用c ++ msvs编写的keil hid客户端与我的fw和hidapi不能正常工作

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

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

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

4

2 回答 2

1

艾伦·奥特(Alan Ott)给我写了以下内容

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

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

于 2015-07-28T17:38:25.380 回答
1

几天后,一些事情变得清晰了

ReportID 似乎是 Windows 中的某些东西,并且仅在主机端......固件对我的设置没有影响

最初还没有明确的是 ReportID 是除了最大 64 个报告字节之外

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

因此,写入调用数据大小需要为 1 + 无论报告大小在 USB 隐藏描述符端点端

在linux中没有隐藏我可以看到的ReportID

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

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

于 2015-07-28T05:31:42.483 回答