Я работаю с устройством (wiimote), которое принимает команды через канал DATA и принимает только те пакеты команд, которые ТОЧНО соответствуют самой команде. Например, он примет:
0x11 0x10
но он не примет
0x11 0x10 0x00 0x00 0x00 ... etc.
Это проблема для окон, так как 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 ().
Можно ли как-то передать данные на устройство произвольного размера? Спасибо заранее за любую помощь.
Решаемые. Я использовал решение, похожее на парней в дельфин, эмулятор Wii. По-видимому, в стеке Microsoft Bluetooth функция WriteFile () работает некорректно, что приводит к возврату Wiimote с ошибкой. Используя HidD_SetOutputReport () в стеке MS и WriteFile () в стеке BlueSoleil, я смог успешно подключиться к устройству (по крайней мере, на моем компьютере).
Я не проверял это в стеке BlueSoleil, но Dolphin использует этот метод, поэтому можно с уверенностью сказать, что он работает.
Вот суть, содержащая некрасивую реализацию этого исправления:
https://gist.github.com/Flafla2/d261a156ea2e3e3c1e5c