hidapi Windows 8.1 ошибка hid_write

hw: плата lpc1549 eval с тестовой прошивкой USB hid...

размер конечной точки 64 байта intr конечной точки считывает out-report buf и отображает len и данные в шестнадцатеричном формате ... копирует out_report в in_report buf и возвращает обратно с функцией записи и len

хозяин :

используя qt5, libusb-1.0.19 wingw32 dll и код hidapi

скрытый тестовый код успешно выдает все ваши вызовы API (кроме записи и чтения) в linux, win7 и win8.1

тестовый код выдает hid_write, за которым следует hid_read, и правильно возвращает данные в linux

я не использую идентификатор отчета с обязательным флагом Hidapi hid_write, поскольку прошивка nxp и программное обеспечение keil не используют его (насколько я мог понять) ... мой linux sw отправляет и получает определенный шаблон размером 64 байта или меньше len) правильно и байт [0] является частью этого шаблона ... out и в байте [0] данные намеренно отличаются и правильно получены

запуск клиента keil hid под windows позволяет правильно взаимодействовать с прошивкой lpc1549, даже если они передают и повторяют только один байт ...

в моей прошивке размер конечной точки изменен на 64 байта (я надеюсь, что мои изменения верны), и клиент keil hid работает с ним в Windows, поэтому я предполагаю, что мои дескрипторы верны ... надеюсь

host sw kububtu 14.04 hid_write len = 17, устройство 17 байт получено, 17 байт указано как полученное... вроде все работает нормально

host sw с hidapi в win 8.1 hid_write len = 17 байт отображается на устройстве с 16 правильными байтами, а остальные равны 0, но чтение указывает на полученный len 64 ... я выдал запись 17, получил 16 правильно, но было указано как 64 получено также win 8.1 выдает пустое окно подсказки system32/cmd вверх ... почему ???

то же самое зависает на win7, и только hid_write len = 0 удается ... выдает ту же подсказку cmd ... получил len = 64, но данные не передаются (как это имело бы смысл с len = 0)

я не могу сделать один шаг или точки останова, так как отладчик qt получает ошибку сегмента при загрузке приложения

также я ссылаюсь в своем приложении qt на код hidapi "windows/hid.c", и теперь он является частью моего кода

извините за мое довольно сложное описание

почему идентификатор отчета является обязательным, если он не используется ... это будет пустой тратой одного байта, а если требуется выравнивание uint32_t, это будет пустой тратой около 7% 64-байтовых данных.

почему клиент keil hid, написанный на c++ msvs, корректно работает с моей прошивкой, а hidapi нет

будет ли функционирование клиента keil hid указывать на то, что мой fw, мои дескрипторы и отчет len верны

Что может вызвать появление пустой командной строки cmd?

Что я могу делать неправильно (целое приложение на основе Hidapi правильно взаимодействует с полной прошивкой на основе USB, а не только с описанным тестовым кодом)?


person Ein HexenMeister    schedule 24.07.2015    source источник


Ответы (2)


через пару дней кое-что прояснилось

ReportID кажется чем-то в Windows и только на стороне хоста ... прошивка не влияет на мою настройку

также то, что не нужно было очищать изначально, заключается в том, что ReportID является дополнением к максимальным 64 байтам отчета.

поэтому я создаю буфер с 1 + 64 байта = 65 ... 1-й равен нулю, так как я не использую механизм ReportID, а остальные 64 обычно используются

поэтому размер данных вызова записи должен быть 1 + независимо от размера отчета на стороне конечной точки дескриптора usb hid.

в Linux нет ReportID, что я мог видеть

следующий: убедитесь, что длина данных, указанная в вызове записи на хосте, а также на устройстве, точно соответствует определениям размера конечной точки, в противном случае данные не передаются ни в одном направлении, и ваше программное обеспечение может зависнуть (ждать вечно) при чтении на другом конце.

я надеюсь, что это может помочь другим получить лучшее представление о конце окон вызовов hidapi hid_write

person Ein HexenMeister    schedule 28.07.2015

Алан Отт написал мне следующее

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

Всегда есть идентификатор отчета. Вы всегда должны отправлять идентификатор отчета в HIDAPI, но он не будет отправлен на устройство, если идентификатор отчета равен 0.

person Ein HexenMeister    schedule 28.07.2015