我拿了/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编程的新手,但是我几乎整天都没有运气,而且没有运气。
答案 0 :(得分:3)
我明白了。
问题是我从枚举它们的函数中接收到错误的管道号,然后调用此函数 - 这是未经修改的Apple示例代码。
有点像,我正在写管道1并等待管道2的响应。通过大量的试验和错误以及允许我发送和监视不同管道上的数据的Windows实用程序,我意识到我需要写入管道3并从管道4读取。管道号码可能被交换(我对数字不太好)但分组是正确的 - 必须使用3和4而不是1和2。