2009-12-07 3 views
1

나는 /Developer/Examples/IOKit/usb/USBSimple Example을 가져다가 실제로 일부 데이터를 장치로 전송합니다. 그래서 코드의 읽기 부분 그것이 transferData: ReadPipeFailed, err = e00002ed 출력 때이 장치를 분리 할 때까지 중단USB 응용 프로그램에서 ReadPipe로 Mac 응용 프로그램이 멈 춥니 다

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 기능입니다 .

비동기 방식을 사용하여 문제를 단순화하지만 아무 소용이없는 Apple의 예제와는 달리이 동기식 방식을 사용했습니다. 기기가 응답하지 않습니까? 하지만 메서드를 건너 뛰지 않고 numBytesRead에서 0을 반환하면 안됩니까?

힌트가 있습니까? 나는 내가 Mac OS X 프로그래밍의 초보자라는 것을 인정하지만, 오늘은 하루 종일 운 좋게도 이것을 꺼 냈습니다.

+0

Did 빠른 Google과이 물건 주변의 문제 중 일부는 상당히 복잡하다는 것을 알았습니다. 누군가가 이것을 해결하는 데 시간이 좀 걸릴 수도 있습니다. Mac 용 USB 코드를 작성하고 싶었 기 때문에이 질문에 흥미가 있습니다. 잠시 시간을 내면 좀 더 자세히 살펴 보겠습니다. 한편, numBytesRead의 값이 중요하다는 것을 암시하는 참조를 발견했습니다. Mac 드라이버 소프트웨어만큼 당신이 말하는 장치를 이해하는 것이 중요하다고 생각합니다. –

+0

나는 그 답을 모른다. 그러나 여기에 운이 없다면이 질문을 할 수있는 좋은 곳은 Apple USB 개발 메일 링리스트 일 것이다. [http://lists.apple.com/mailman/listinfo/usb](http://lists.apple.com/mailman/listinfo/usb) 꽤 적극적인 이메일 목록이며 훌륭한 Apple USB 엔지니어. –

답변

3

나는 그것을 알아 냈다.

문제는 내가 그들을 열거하고이 함수를 호출하는 함수에서 잘못된 파이프 번호를 수신하고 있다는 것입니다. 즉, 영향을받지 않는 Apple 예제 코드였습니다.

나는 파이프 1에 쓰고 파이프 2에서 응답을 기다리고 있었다. 시행 착오와 다른 파이프에서 데이터를 보내고 볼 수있게 해주는 Windows 유틸리티를 통해 나는 파이프 3에 쓰고 파이프 4에서 읽는 데 필요했습니다. 파이프 번호가 바뀔 수도 있지만 (숫자가 너무 좋지는 않습니다) 그룹핑은 괜찮습니다 - 1과 2 대신 3과 4를 사용해야합니다.

관련 문제