hidapi:发送小于caps.OutputReportByteLength的数据包

时间:2015-04-06 21:40:38

标签: c++ windows writefile hidapi

我正在使用通过DATA管道接收命令的设备(wiimote),并且只接受与命令本身一样长的命令包。例如,它将接受:

0x11 0x10

但不接受:

0x11 0x10 0x00 0x00 0x00 ... etc.

这是Windows上的问题,因为Windows上的WriteFile()要求传递给它的byte []至少与caps.OutputReportByteLength一样长。在Mac上,如果没有此限制,我的代码可以正常工作。以下是来自hid.c的代码导致此问题:

/* Make sure the right number of bytes are passed to WriteFile. Windows
   expects the number of bytes which are in the _longest_ report (plus
   one for the report number) bytes even if the data is a report
   which is shorter than that. Windows gives us this value in
   caps.OutputReportByteLength. If a user passes in fewer bytes than this,
   create a temporary buffer which is the proper size. */
if (length >= dev->output_report_length) {
    /* The user passed the right number of bytes. Use the buffer as-is. */
    buf = (unsigned char *) data;
} else {
    /* Create a temporary buffer and copy the user's data
       into it, padding the rest with zeros. */
    buf = (unsigned char *) malloc(dev->output_report_length);
    memcpy(buf, data, length);
    memset(buf + length, 0, dev->output_report_length - length);
    length = dev->output_report_length;
}
res = WriteFile(dev->device_handle, buf, length, NULL, &ol);

如评论中所述,删除上述代码会导致WriteFile()发生错误。

有什么办法可以将数据传递给任意大小的设备吗?提前感谢您的任何帮助。

1 个答案:

答案 0 :(得分:1)

解决。我使用的解决方案类似于Dolphin的人,一个Wii模拟器。显然,在Microsoft蓝牙堆栈上,WriteFile()无法正常工作,导致Wiimote返回错误。通过在MS堆栈上使用HidD_SetOutputReport()和在BlueSoleil堆栈上使用WriteFile(),我能够成功连接到设备(至少在我的机器上)。

我没有在BlueSoleil堆栈上测试过这个,但是Dolphin正在使用这种方法,因此可以肯定地说它有效。

这是一个包含此修复的丑陋实现的要点: https://gist.github.com/Flafla2/d261a156ea2e3e3c1e5c