Mac应用程序挂起来自USB设备的ReadPipe

时间:2009-12-07 17:44:09

标签: c macos usb

我拿了/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的例子,它使用异步方法来简化事情,但无济于事。设备不响应​​吗?但是如果它不应该只是跳过并在numBytesRead中返回0?

任何提示?我承认我是Mac OS X编程的新手,但是我几乎整天都没有运气,而且没有运气。

1 个答案:

答案 0 :(得分:3)

我明白了。

问题是我从枚举它们的函数中接收到错误的管道号,然后调用此函数 - 这是未经修改的Apple示例代码。

有点像,我正在写管道1并等待管道2的响应。通过大量的试验和错误以及允许我发送和监视不同管道上的数据的Windows实用程序,我意识到我需要写入管道3并从管道4读取。管道号码可能被交换(我对数字不太好)但分组是正确的 - 必须使用3和4而不是1和2。