-
I'm trying to read data from the camera, the camera works on the plug and play principle, that is, it does not require any additional settings. [Errno 5] Input/Output Error
Traceback (most recent call last):
File "/home/defaultuser/Downloads/usb_driver/usb_dbus.py", line 45, in GetData
ret = list(usb_driver.ep_read.read(cons.PACKAGE_SIZE))
File "/usr/lib/python3.8/site-packages/usb/core.py", line 423, in read
return self.device.read(self, size_or_buffer, timeout)
File "/usr/lib/python3.8/site-packages/usb/core.py", line 1029, in read
ret = fn(
File "/usr/lib/python3.8/site-packages/usb/backend/libusb1.py", line 879, in iso_read
return handler.submit(self.ctx)
File "/usr/lib/python3.8/site-packages/usb/backend/libusb1.py", line 680, in submit
_check(_lib.libusb_submit_transfer(self.transfer))
File "/usr/lib/python3.8/site-packages/usb/backend/libusb1.py", line 604, in _check
raise USBError(_strerror(ret), ret, _libusb_errno[ret]) Camera metadata:
My code: def init(dev):
global ret, ep_read, ep_write
print("init")
# try:
# if dev.is_kernel_driver_active(0):
# dev.detach_kernel_driver(0)
# except Exception as e:
# print(e)
# print("Error detaching kernel driver")
# return e
# try:
# dev.reset()
# except Exception as e:
# print(e)
# print("Error resetting device")
# return e
try:
dev.set_configuration()
except Exception as e:
print(e)
print("Error setting configuration")
return e
try:
cfg = dev.get_active_configuration()
print(cfg)
intf = cfg[(0, 0)]
for cf in cfg:
print(cf.bInterfaceNumber)
if cf.bInterfaceNumber != 0 and cf.bAlternateSetting == 0x5:
print("\n\nintf")
print(cf)
intf = cf
break
except Exception as e:
print(e)
print("Error getting configuration")
return e
try:
ep_read = usb.util.find_descriptor(
intf,
custom_match= \
lambda e: \
usb.util.endpoint_direction(e.bEndpointAddress) == \
usb.util.ENDPOINT_IN)
except Exception as e:
print(e)
print("Error finding IN endpoint")
return e
try:
ep_write = usb.util.find_descriptor(
intf,
custom_match= \
lambda e: \
usb.util.endpoint_direction(e.bEndpointAddress) == \
usb.util.ENDPOINT_OUT)
except Exception as e:
print(e)
print("Error finding OUT endpoint")
return e PACKAGE_SIZE = 65536 def GetData(self) -> List[int]:
try:
# print(usb_driver.ep_read)
while True:
ret = list(usb_driver.ep_read.read(cons.PACKAGE_SIZE))
print(ret)
if ret[0] != 253 and self.remain_data == []:
continue
self.data += ret
if self.remain_data != []:
self.data = self.remain_data + self.data
self.remain_data = []
print("No valid packet: ", self.data)
self.result_data = []
while True:
if len(self.data) >= 2:
payload_length = self.data[1]
if len(self.data) == payload_length + 12:
self.result_data += self.data
self.data = []
print("Result data: ", self.result_data)
return self.result_data
elif len(self.data) > payload_length + 12:
self.result_data += self.data[:payload_length + 12]
print("Data: ", self.data)
self.data = self.data[payload_length + 12:]
else:
self.remain_data += self.data
self.data = []
print("Remain data: ", self.remain_data)
print("Result data: ", self.result_data)
return self.result_data
else:
self.remain_data += self.data
self.data = []
print("Remain data: ", self.remain_data)
print("Result data: ", self.result_data)
return self.result_data
except Exception as e:
print(e)
traceback.print_exc()
return [] And i can get data from some STM or ESP boards. |
Beta Was this translation helpful? Give feedback.
Answered by
mcuee
May 26, 2024
Replies: 1 comment
-
You have to know the communcation protocol in order to use pyusb/libusb. |
Beta Was this translation helpful? Give feedback.
0 replies
Answer selected by
mcuee
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
You have to know the communcation protocol in order to use pyusb/libusb.