Я пытаюсь общаться с довольно специфическим USB-устройством и разрабатывать как Windows, так и Mac-код для этого.
Устройство представляет собой USB-устройство с интерфейсом HID (класс 3) с двумя конечными точками, вход прерывания и выход прерывания. Характер устройства таков, что данные отправляются с устройства на конечную точку ввода только тогда, когда запрашиваются данные от хоста: хост отправляет ему данные, на которые устройство отвечает на его конечную точку прерывания ввода. Получение данных на устройство (запись) намного проще...
Код для Windows довольно прямолинейный: я получаю дескриптор устройства, а затем вызываю либо ReadFile, либо WriteFile. По-видимому, большая часть основного асинхронного поведения абстрагируется. Он работает нормально.
Однако на Mac это немного более стильно. Я пробовал несколько вещей, ни один из них не был полностью успешным, но вот две вещи, которые казались наиболее перспективными...
1.) Попытайтесь получить доступ к устройству (как USB) через IOUSBInterfaceInterface, итерации по конечным точкам для определения конечных точек ввода и вывода и (надеюсь) использовать ReadPipe и WritePipe для связи. К сожалению, я не могу открыть интерфейс, как только он есть, с возвращаемым значением (kIOReturnExclusiveAccess), отметившим, что что-то уже открыло устройство. Я попытался использовать IOUSBinterfaceInterface183, чтобы я мог вызвать USBInterfaceOpenSeize, но это приводит к тому же возврату ошибки.
--- обновление 7/30/2010 ---
По-видимому, Apple IOUSBHIDDriver соответствует раннему устройству, и это, вероятно, предотвращает открытие IOUSBInterfaceInterface. Из-за некоторого копания кажется, что общий способ предотвратить совпадение IOUSBHIDDriver заключается в написании кода без ключа (расширение ядра) с более высокой оценкой зонда. Это будет соответствовать ранним, не позволяя IOUSBHIDDriver открыть устройство, и теоретически должно позволить мне открыть интерфейс и напрямую написать и прочитать конечные точки. Это нормально, но я бы предпочел не устанавливать что-то дополнительное на машине пользователя. Если кто-нибудь знает о твердой альтернативе, я был бы благодарен за информацию.
2.) Откройте устройство как IOHIDDeviceInterface122 (или позже). Чтобы читать, я настроил асинхронный порт, источник события и метод обратного вызова, которые будут вызываться, когда данные готовы - когда данные отправляются с устройства на конечную точку прерывания ввода. Однако, чтобы написать данные - что нужно устройству - чтобы инициализировать ответ, я не могу найти способ. Я в тупике. setReport обычно записывает в конечную точку управления, плюс мне нужна запись, которая не ожидает прямого ответа, без блокировки.
Я посмотрел в Интернете и много пробовал, но ни один из них не дает мне успеха. Любой совет? Я не могу использовать большую часть кода Apple HIDManager, так как большая часть из них - 10.5+, и мое приложение должно работать и на 10.4.