2014-10-23 1 views
0

나는 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 

왜 이런 일이 않습니다를? 버퍼가 어떻게 데이터를 전송하는 동안 다양한 장소에 데이터를 저장하는지에 대해 이해하지 못하고 있지만, 진행 상황에 대한 명확한 설명을 찾을 수 없었습니다.

답변

1

답장 시간은 얼마입니까? dev.read을 구조화하는 방법은 PyUSB에 응답 길이가 100 바이트가되어야한다는 것을 알려주고 100ms에서 100 바이트를 얻지 못하면 시간 초과 예외를 발생시킵니다. 장치가 더 작은 메시지로 응답하면 해당 메시지 길이가 맞더라도 100ms가 지나면 오류가 발생합니다. 그래서, 당신은 2 가지 중 하나를 할 수 있습니다 :

1) 시간 초과 변수를 제거하십시오. 이 경우 PyUSB는 오류없이 기본 시간과 보고서 응답을 기다립니다. 기본값보다 빨리 시간 초과해야하는 경우이 방법이 도움이되지 않습니다.

2) 응답 시간이 얼마 남았는지 알 수있는 경우 (일부 데이터가있는 것처럼 들리므로이 경우 일 수 있습니다.), 100 바이트 대신이 값을 사용하십시오. 이렇게하면 오류없이 데이터가 다시 제공되며 여전히 시간 초과 변수를 설정할 수 있습니다.

+0

팁 주셔서 감사합니다. 데이터가 약 16KB/초로 연속 스트림 (센서가 켜지고 데이터가 전송되는 즉시 전송되기 시작합니다)으로 제공되므로 100 바이트를 쉽게 전달해야합니다. 100 밀리 초. 나는 매우 큰 타임 아웃으로 다시 시도하고 몇 번의 호출 후에 같은 오류로 간다. – dimachidy

+0

데이터의 '연속 스트림'인 경우에도 USB가 패킷으로 전송 및 수신하며 무한 길이의 팩을 수신하지 못합니다. 데이터 스트림을 시작하라는 요청을 하나만 보낼 수는 있지만 데이터는 미리 정해진 길이의 청크로 다시 나타납니다. 정확한 애플리케이션이 무엇인지 잘 모르겠습니다. 따라서 마이크로가 3 개의 센서 온도를보고한다고 가정 해보십시오. 그것은 주어진 시간에 각각의 온도를 읽고 그것들을 패킷으로 묶어 USB를 통해 그 데이터를 전송합니다. 그런 다음 설정된 시간 간격에 도달하면 프로세스가 반복됩니다. –

+0

(con't) PyUSB에게 패킷이 100 바이트 길이가되어야한다고 알려주고 타임 아웃 기간 내에 수신하지 않으면 오류가 발생합니다.당신이해야 할 일은 위의 지시에 따라 하나의 읽기 명령이 오류를 발생시키지 않도록하고 나서 독서를 멈출 준비가 될 때까지 (예 : 시간 간격, 사용자가 버튼을 누르는 등) 읽기 요청을 반복합니다. –

0

확실하지 않은 경우 수신 된 패킷의 크기를 수정하지 마십시오. 가능하면, 엔드 포인트의 최대 패킷 크기를 찾아 당신의 읽기 방법에 대한 두 번째 인수로 사용 : 일반적으로

endpoint.wMaxPacketSize 

, 당신이 볼 수 또는 decriptors, 엔드 포인트 및 인터페이스 터미널에서이 명령을 입력하여 :

lsusb -d vendorId:productId -v 

이렇게하면 최대 패킷 크기를 직접 제공합니다. 희망이 있으면 오류를 해결하는 데 도움이됩니다.

관련 문제