나는 Macbook Air와 16 진수 데이터를 연속적으로 전송하는 마이크로 컨트롤러 센서 사이에 USB 연결이 있습니다. Python에서 PyUSB를 사용하여 데이터를 얻으려고합니다. 그래서 같은 마이크로 컨트롤러 연결 PyUSB 사용 :시간 초과 오류가 발생하지 않고 PyUSB 함수 dev.read()를 반복적으로 호출 할 수없는 이유는 무엇입니까?
dev.read(0x1,100,100)
:
import usb
dev = usb.core.find(idVendor=0xXXXX, idProduct=0xXXXX)
dev.set_configuration()
cfg = dev.get_active_configuration()
intf = cfg[(0,0)]
ep = usb.util.find_descriptor(intf,custom_match = lambda e: usb.util.endpoint_direction(e.bEndpointAddress) == usb.util.ENDPOINT_OUT)
그때 처음 작업 한 dev.read() 방법을 사용하는 어레이에 장치로부터 데이터를 판독하려
이 길이 (100)의 배열을 생산,하지만 난 dev.read (0x1,100,100) 더 여러 번 호출 (여러 이상의 배열을 가지고) 한 후이 오류 시작하기 :
dev.read(0x1,100,100)
Traceback (most recent call last):
File "stdin", line 1, in <module>
File "/Users/dimachy/anaconda/lib/python2.7/site-packages/usb/core.py", line 918, in read
self.__get_timeout(timeout))
File "/Users/dimachy/anaconda/lib/python2.7/site-packages/usb/backend/libusb1.py", line 777, in bulk_read
timeout)
File "/Users/dimachy/anaconda/lib/python2.7/site-packages/usb/backend/libusb1.py", line 880, in __read
_check(retval)
File "/Users/dimachy/anaconda/lib/python2.7/site-packages/usb/backend/libusb1.py", line 560, in _check
raise USBError(_str_error[ret], ret, _libusb_errno[ret])
usb.core.USBError: [Errno 60] Operation timed out
왜 이런 일이 않습니다를? 버퍼가 어떻게 데이터를 전송하는 동안 다양한 장소에 데이터를 저장하는지에 대해 이해하지 못하고 있지만, 진행 상황에 대한 명확한 설명을 찾을 수 없었습니다.
팁 주셔서 감사합니다. 데이터가 약 16KB/초로 연속 스트림 (센서가 켜지고 데이터가 전송되는 즉시 전송되기 시작합니다)으로 제공되므로 100 바이트를 쉽게 전달해야합니다. 100 밀리 초. 나는 매우 큰 타임 아웃으로 다시 시도하고 몇 번의 호출 후에 같은 오류로 간다. – dimachidy
데이터의 '연속 스트림'인 경우에도 USB가 패킷으로 전송 및 수신하며 무한 길이의 팩을 수신하지 못합니다. 데이터 스트림을 시작하라는 요청을 하나만 보낼 수는 있지만 데이터는 미리 정해진 길이의 청크로 다시 나타납니다. 정확한 애플리케이션이 무엇인지 잘 모르겠습니다. 따라서 마이크로가 3 개의 센서 온도를보고한다고 가정 해보십시오. 그것은 주어진 시간에 각각의 온도를 읽고 그것들을 패킷으로 묶어 USB를 통해 그 데이터를 전송합니다. 그런 다음 설정된 시간 간격에 도달하면 프로세스가 반복됩니다. –
(con't) PyUSB에게 패킷이 100 바이트 길이가되어야한다고 알려주고 타임 아웃 기간 내에 수신하지 않으면 오류가 발생합니다.당신이해야 할 일은 위의 지시에 따라 하나의 읽기 명령이 오류를 발생시키지 않도록하고 나서 독서를 멈출 준비가 될 때까지 (예 : 시간 간격, 사용자가 버튼을 누르는 등) 읽기 요청을 반복합니다. –