为什么我不能重复调用PyUSB函数dev.read(),而不出现超时错误?

2024-05-23 13:20:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个连接在MacBookAir和一个微控制器传感器之间的USB接口,该传感器可以连续地传输十六进制数据。我试图在Python中使用PyUSB来获取数据。我用PyUSB连接到微控制器,就像这样:

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(0x1100100)并获得多个数组后,我开始出现以下错误:

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

为什么会这样?我怀疑我对缓冲区在数据传输过程中如何在不同的位置存储数据不太了解,但还没有找到一个清晰的解释。


Tags: 数据inpycoredevreadlibpackages
2条回答

你回复的时间有多长?构造dev.read的方式是告诉PyUSB响应应该是100字节长,如果在100毫秒内没有得到100字节,则抛出超时异常。如果您的设备以较小的消息响应,则在达到100毫秒后将收到错误,即使该消息长度正确。所以,你可以做两件事中的一件:

1)删除超时变量。在这种情况下,PyUSB将等待默认的时间量和报告响应,而不会出现错误。如果需要比默认值更快地超时,这将不会有帮助

2)更好的方法是,如果你知道你得到的响应的长度(听起来你得到了一些数据,所以可能是这样),使用这个值而不是100字节。这将使您返回的数据没有错误,仍然允许您设置超时变量。

如果不确定,请尝试不修复接收的数据包的大小。如果可能,请查找终结点的最大数据包大小,并将其用作read方法的第二个参数:

endpoint.wMaxPacketSize

通常,您可以通过在终端中键入以下命令来查看或描述器、端点和接口:

lsusb -d vendorId:productId -v

这将直接为您提供最大数据包大小。 希望这能帮助你改正错误。

相关问题 更多 >