libusb 기능을 사용하여 USB 장치와 통신하는 콘솔 프로그램을 작성 중입니다.
장치가 올바르게 열거되었으며 두 개의 끝점이 있습니다.
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
일괄 기능을 통해 3바이트를 보내려고 합니다.
dump( cmdPrinter, nCmdSize, "[usbxsfer] OUT:");
ret = libusb_bulk_transfer( devHandle, EP_OUT,
(unsigned char*)&cmdPrinter, nCmdSize, &wrote, timeout);
LOG4("[usbxsfer] OUT[x%02X] ret: %d - wrote: %d - pcksize=%d\n",
EP_OUT, ret, wrote, nCmdSize);
그리고 응답을 읽어보세요:
int toRead = 10;
ret = libusb_bulk_transfer(devHandle, EP_IN, (unsigned char*)bufferRx+offs, toRead, &xferred, timeout);
LOG2("[usbxsfer] IN ret: %d - xferred: %d\n", ret, xferred);
장치가 명령을 실행하지 않고(일부 탭이 표시됨) 응답하지 않습니다(오류 -7 = 시간 초과(3초)).
tshark
케이블에 스니핑 바이트를 설치 하고 "1D E0 0F" 바이트 전송을 시도했습니다. 순수한 고양이는 다음과 같습니다.
Frame 3: 67 bytes on wire (536 bits), 67 bytes captured (536 bits) on interface 0
Interface id: 0 (usbmon0)
Interface name: usbmon0
Encapsulation type: USB packets with Linux header and padding (115)
Arrival Time: Aug 26, 2022 18:11:55.083144000 CEST
[Time shift for this packet: 0.000000000 seconds]
Epoch Time: 1661530315.083144000 seconds
[Time delta from previous captured frame: 0.001053000 seconds]
[Time delta from previous displayed frame: 0.001053000 seconds]
[Time since reference or first frame: 0.001211000 seconds]
Frame Number: 3
Frame Length: 67 bytes (536 bits)
Capture Length: 67 bytes (536 bits)
[Frame is marked: False]
[Frame is ignored: False]
[Protocols in frame: usb]
USB URB
[Source: host]
[Destination: 5.6.2]
URB id: 0xffffffc0774cfe40
URB type: URB_SUBMIT ('S')
URB transfer type: URB_BULK (0x03)
Endpoint: 0x02, Direction: OUT
0... .... = Direction: OUT (0)
.... 0010 = Endpoint number: 2
Device: 6
URB bus id: 5
Device setup request: not relevant ('-')
Data: present (0)
URB sec: 1661530315
URB usec: 83144
URB status: Operation now in progress (-EINPROGRESS) (-115)
URB length [bytes]: 3
Data length [bytes]: 3
[bInterfaceClass: Unknown (0xffff)]
Unused Setup Header
Interval: 0
Start frame: 0
Copy of Transfer Flags: 0x00000000
Number of ISO descriptors: 0
Leftover Capture Data: d8abcb
0000 40 fe 4c 77 c0 ff ff ff 53 03 02 06 05 00 2d 00 @.Lw....S.....-.
0010 cb f0 08 63 00 00 00 00 c8 44 01 00 8d ff ff ff ...c.....D......
0020 03 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 ................
0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0040 d8 ab cb ...
이것은 장치로 전송된 첫 번째 패킷이어야 합니다. 버퍼에서 내 바이트를 볼 수 없습니다! 어쨌든 결과는 양호하고(worte=3) 3바이트가 전송됩니다.
[2022-08-26 18:11:55] [usbxsfer] devHandle: 0x55a8dbdac0, nCmdSize: 3
[2022-08-26 18:11:55] [usbxsfer] OUT: [3] 1D E0 0F
[2022-08-26 18:11:55] [usbxsfer] OUT[x02] ret: 0 - wrote: 3 - pcksize=3
버퍼는 올바른 것 같지만 데이터가 버퍼에 없습니다. 아마도 이것이 명령이 실행되지 않고 응답되지 않는 이유일 것입니다.
어떤 아이디어가 있나요?
답변1
해결되었습니다! !
문제는 libusb_bulk_transfer() 호출에 있었습니다. 포인터를 포인터에 전달하고 있었습니다.
올바른 코드는 다음과 같습니다:
ret = libusb_bulk_transfer( devHandle, EP_OUT,
(unsigned char*)cmdPrinter, nCmdSize, &wrote, timeout);
이제 데이터가 명령 실행을 종료하는 것을 볼 수 있습니다.