2013-07-03 5 views
0

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

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

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

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

НО, передача обратного вызова моей программы возвращается с кодом состояния передачи 0, что указывает на успех, даже несмотря на то, что мое устройство USB не получает их.

Мои вопросы:

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

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

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

Мой «Detatch» это следующие вызовы:

libusb_release_interface() 
libusb_reset_device() 
libusb_close() 

Тогда мой «Attach» является:

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

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

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

Спасибо!

+0

Вы не должны 'attach_kernel_driver()' в открепление вызовов? –

+0

И, вам не нужно «detach_kernel_driver()' в ваших входящих вызовах? –

ответ

0

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

Мой "Detatch" это следующие вызовы:

libusb_release_interface(); В вашем detatch, вам нужно прикрепить драйвер ядра 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();