hidapi:发送小于 caps.OutputReportByteLength 的数据包
hidapi: Sending packet smaller than caps.OutputReportByteLength
我正在使用一个设备(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() 出错。
有什么方法可以将数据传递到任意大小的设备?在此先感谢您的帮助。
已解决。我使用了类似于 Dolphin 上的人的解决方案,一个 Wii 模拟器。显然,在 Microsoft 蓝牙堆栈上,WriteFile() 无法正常工作,导致 Wiimote return 出现错误。通过在 MS 堆栈上使用 HidD_SetOutputReport() 和在 BlueSoleil 堆栈上使用 WriteFile() ,我能够成功连接到设备(至少在我的机器上)。
我没有在 BlueSoleil 堆栈上对此进行测试,但 Dolphin 正在使用此方法,因此可以肯定地说它有效。
这是一个要点,其中包含此修复程序的丑陋实现:
https://gist.github.com/Flafla2/d261a156ea2e3e3c1e5c
我正在使用一个设备(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() 出错。
有什么方法可以将数据传递到任意大小的设备?在此先感谢您的帮助。
已解决。我使用了类似于 Dolphin 上的人的解决方案,一个 Wii 模拟器。显然,在 Microsoft 蓝牙堆栈上,WriteFile() 无法正常工作,导致 Wiimote return 出现错误。通过在 MS 堆栈上使用 HidD_SetOutputReport() 和在 BlueSoleil 堆栈上使用 WriteFile() ,我能够成功连接到设备(至少在我的机器上)。
我没有在 BlueSoleil 堆栈上对此进行测试,但 Dolphin 正在使用此方法,因此可以肯定地说它有效。
这是一个要点,其中包含此修复程序的丑陋实现: https://gist.github.com/Flafla2/d261a156ea2e3e3c1e5c