Macbook Air与微控制器传感器之间有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(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
为什么会这样?我怀疑我并不了解缓冲区在数据传输过程中如何在各个地方存储数据,但是我们无法找到明确的解释。
答案 0 :(得分:1)
您回复的回复时间是多长?您构建dev.read
的方式是告诉PyUSB响应应该是100字节长,如果您在100毫秒内没有得到100个字节,则抛出超时异常。如果您的设备使用较小的消息进行响应,则在达到100ms后将收到错误,即使该消息长度正确也是如此。所以,你可以做两件事之一:
1)删除超时变量。在这种情况下,PyUSB将等待一段默认时间并且报告响应没有错误。如果你需要超过默认值的超时,这不会有帮助
2)更好的是,如果你知道你进入的响应的长度(听起来你有一些数据,所以可能就是这种情况),使用这个值而不是100个字节。这将为您提供没有错误的数据,并且仍然允许您设置超时变量。
答案 1 :(得分:0)
如果您不确定,请尽量不要修复收到的数据包的大小。如果可能,请查找端点的最大数据包大小,并将其用作read方法的第二个参数:
endpoint.wMaxPacketSize
通常,您可以通过在终端中键入以下命令来查看或描述摘要,端点和接口:
lsusb -d vendorId:productId -v
这将直接为您提供最大数据包大小。 希望这可以帮助您纠正错误。