Используя асинхронную массовую передачу libusb, устройство перестает получать, если мы бездействуем

Я пишу программу для Linux (используя Qt 4.8 и libusb 1.0), которая будет взаимодействовать с пользовательским USB-устройством (в настоящее время программируется коллегой).

Шаг 1 заключается в том, чтобы через регулярные промежутки времени «пульс» переходил туда и обратно через USB. В настоящее время я использую асинхронную массовую передачу.

Для тестирования я поместил свой «Send_Heartbeat()» на нажатие кнопки. Если я нажимаю на кнопку МНОГО и ставлю в очередь несколько сообщений для отправки, пока я держу свою очередь занятой, сообщения продолжают отправляться, а мое USB-устройство продолжает их получать.

Если я остановлюсь на несколько секунд, а затем возобновлю и добавлю новые сообщения в очередь, USB-устройство перестанет их получать.

НО, обратный вызов передачи моей программы ДЕЙСТВИТЕЛЬНО возвращает с кодом состояния передачи 0, что указывает на успех, даже если мое USB-устройство не получает их.

Мои вопросы:

  1. Почему статус передачи обратного вызова указывает на успех, если мое USB-устройство перестало их получать?
  2. Кто-нибудь слышал о таком поведении?

Стоит отметить, что если я отключу USB-устройство, я получу правильные коды состояния, возвращаемые в моем обратном вызове, указывающие на то, что устройство исчезло.

Если USB-устройство остается подключенным и работающим, а я «Отсоединяю», а затем снова «Присоединяю», чтобы принудительно восстановить соединение и попытаться отправить больше тестовых импульсов, это работает! USB-устройство снова начинает получать сообщения.

Моя "Отвязка" - это следующие вызовы:

libusb_release_interface()
libusb_reset_device()
libusb_close()

Тогда мой «Прикрепить»:

libusb_get_device_list()
libusb_get_device_descriptor()
libusb_open()
libusb_set_configuration()
libusb_claim_interface()

Мой следующий шаг — определить, какая из команд libusb восстанавливает связь.

Между тем, я надеюсь, что кто-то распознает эти симптомы и предложит. Поскольку я впервые программирую USB-связь, мне интересно, есть ли какой-то фундамент, который я пропустил.

Спасибо!


person Doug    schedule 03.07.2013    source источник
comment
Разве вам не нужно attach_kernel_driver() в вызовах отсоединения?   -  person    schedule 15.07.2013
comment
И разве вам не нужно detach_kernel_driver() в ваших вызовах присоединения?   -  person    schedule 15.07.2013


Ответы (1)


Проблема здесь, я думаю:

Моя "Отвязка" - это следующие вызовы:

libusb_release_interface(); В вашем детаче нужно прикрепить драйвер ядра detatch_kernel_driver(); libusb_reset_device(); libusb_close();

Тогда мой «Прикрепить»:

libusb_get_device_list(); libusb_get_device_descriptor(); libusb_open(); libusb_set_configuration(); Здесь нужно проверить активен драйвер ядра или нет. Итак, проверьте, что возвращает attach_kernel_driver();, и вызовите detatch_kernel_driver(); if needed libusb_claim_interface();

person Community    schedule 04.08.2013