1

我在 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

为什么会这样?我怀疑我不了解缓冲区在数据传输过程中如何在各个地方存储数据,但无法找到对正在发生的事情的明确解释。

4

3 回答 3

1

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

1)删除超时变量。在这种情况下,PyUSB 将等待默认的时间量并且报告响应没有错误。如果您需要比默认值更快地超时,这将无济于事

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

于 2014-10-23T20:59:47.060 回答
0

如果您不确定,请尽量不要修复收到的数据包的大小。如果可能,请查找端点的最大数据包大小并用作读取方法的第二个参数:

endpoint.wMaxPacketSize

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

lsusb -d vendorId:productId -v

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

于 2017-04-27T16:50:19.173 回答
0

usb.util.dispose_resources(dev)读完后使用。您可以在我的项目中看到一个示例:https ://github.com/JosepEscobar/inverterApi/blob/main/app/data_source.py

于 2022-01-27T09:30:17.650 回答