У меня есть USB-соединение между Macbook Air и микроконтроллером, который непрерывно передает шестнадцатеричные данные. Я пытаюсь использовать PyUSB в Python для получения данных. Я использовал PyUSB для подключения к микроконтроллеру следующим образом:Почему я не могу вызвать функцию pyUSB dev.read() несколько раз, не получая ошибку тайм-аута?
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(), который работал в первый раз:
dev.read(0x1,100,100)
Это произвело массив длиной 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
Почему это происходит? Я подозреваю, что не понимаю, как буферы хранят данные в разных местах во время передачи данных, но не смогли найти четкое объяснение того, что происходит.
Благодарим вас за отзыв - данные _supposed_ являются непрерывным потоком (он является датчиком и начинает передачу данных сразу же после его включения) примерно в 16 килобайтах в секунду, поэтому 100 байтов должны быть легко доставлены в 100 миллисекунд. Я попробовал снова с очень большим таймаутом и пропустил ту же ошибку после нескольких звонков. – dimachidy
Даже если это «непрерывный поток» данных, USB передает и принимает в пакетах, и вы не получаете пакет бесконечной длины. Вы можете отправить только один запрос для запуска потока данных, но данные вернутся в куски заданной длины. Я не уверен, что такое точное приложение, поэтому скажите, что ваш микрофон должен сообщать о температуре для 3 датчиков. Он будет считывать температуру каждого из них в определенный момент времени, упаковывать их вместе в пакет и передавать эти данные через USB. Затем, как только будет установлен установленный временной интервал, он повторит процесс. –
(con't) Вы сообщаете PyUSB, что ожидаемый пакет должен быть длиной 100 байтов, и если он не получит, что в течение периода ожидания выдаст ошибку.Что вам нужно сделать, следуйте моим инструкциям выше, чтобы не дать одной команде чтения отбросить ошибку, а затем закодировать запрос на чтение до тех пор, пока вы не будете готовы прекратить чтение (например, временной интервал, пользователь нажимает кнопку, что угодно). –