Приложение Mac зависает на ReadPipe с USB-устройства - PullRequest
1 голос
/ 07 декабря 2009

Я взял /Developer/Examples/IOKit/usb/USBSimple Example и изменил его так, чтобы он действительно передавал некоторые данные (и, надеюсь, скоро) с устройства.

Вот моя функция TransferData (с комментариями):

void transferData(IOUSBInterfaceInterface245 **intf, UInt8 inPipeRef, UInt8 outPipeRef)
{
    IOReturn err;
    CFRunLoopSourceRef cfSource;

    err = (*intf)->CreateInterfaceAsyncEventSource(intf, &cfSource);
    if(err) {
        printf("transferData: unable to create event source, err = %08x\n", err);
        return;
    }

    // this is what I need to send to the device

    outBuf[0]   = 0;
    outBuf[1]   = 0;
    outBuf[2]   = 0x18;
    [... snip ...]

    // the following works, although I have no confirmation
    // that the data actually arrives to the device but err is 0 afterwards

    err = (*intf)->WritePipe(intf, outPipeRef, outBuf, 64);
    if(err) {
        printf("transferData: WritePipeFailed, err = %08x\n", err);
        return;
    }

    UInt32 numBytesRead;
    numBytesRead = sizeof(inBuf);

    // this hangs until I disconnect the device

    err = (*intf)->ReadPipe(intf, inPipeRef, inBuf, &numBytesRead);
    if(err) {
        printf("transferData: ReadPipeFailed, err = %08x\n", err);
        return;
    }
}

Таким образом, часть чтения кода зависает, пока я не отключаю устройство, когда оно выводит transferData: ReadPipeFailed, err = e00002ed - что подтверждает, что я на самом деле говорю / слушаю устройство.

Я пошел на этот синхронный метод, в отличие от примера Apple, который использует асинхронный подход для упрощения, но безрезультатно. Устройство не отвечает? Но если это не так, то не должен ли метод просто пропустить и вернуть 0 в numBytesRead?

Есть намеки? Я признаю, что я новичок в программировании на Mac OS X, но сегодня я вывернул это наизнанку почти весь день без всякой удачи.

1 Ответ

3 голосов
/ 11 декабря 2009

Я понял это.

Проблема заключалась в том, что я получал неправильные номера каналов из функции, которая перечисляла их, а затем вызывала эту функцию - это был нетронутый пример кода Apple.

Что-то вроде того, что я писал в канал 1 и ждал ответа по каналу 2. Благодаря куче проб и ошибок и утилите Windows, которая позволяла мне отправлять и просматривать данные по различным каналам, я понял, что мне нужно записать в канал 3 и прочитать из канала 4. Возможно, номера каналов можно поменять (я не слишком хорошо разбираюсь в числах), но с группировкой все в порядке - пришлось использовать 3 и 4 вместо 1 и 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...