linux 从Python阅读数据到HID时发生超时

ax6ht2ek  于 2023-06-29  发布在  Linux
关注(0)|答案(1)|浏览(161)

开发环境

操作系统:Ubuntu 18.04.5 LTS(GNU/Linux 4.9.201-tegra aarch 64)
语言:Python 3.6
设备:Jetson nano、Maxim MAX 35104 EV Kit

问题

  • 阅读HID数据时发生超时。在Python中,第一个设备信息被带来,但有一个问题是数据没有被接收到。

代码

import usb.core

vendor_id = 0x04fa
product_id = 0x3900

device = usb.core.find(idVendor=vendor_id, idProduct=product_id)

if device is None:
    raise ValueError("Not Found USB")

for cfg in device:
    print(f"Configuration: {cfg}")
    for intf in cfg:
        print(f"Interface: {intf}")
        for ep in intf:
            print(f"Endpoint: {ep}")

device.set_configuration()

def read_data():
    endpoint_address = 0x81
    size = 64
    timeout = 1000

    data = device.read(endpoint_address, size, timeout)

data = read_data()

print(data)

我查了什么

  • 在dmesg中确认对应的设备,在Python代码中可以读取对应设备的信息。
  1. dmesg

  2. python程序

1.重新连接USB设备
1.重新启动USB设备
1.用sudo运行程序
1.将超时更改为3秒

emeijp43

emeijp431#

与上一期相比的变化

  • 通过修改代码,不会显示超时。但是,所有数据都是0。
  • 端点out设置为0x1,长度设置为64字节。
  • 接收到数据,但传感器的数据没有变化。

设备信息

DEVICE ID 04fa:3900 on Bus 001 Address 008 =================
 bLength                :   0x12 (18 bytes)
 bDescriptorType        :    0x1 Device
 bcdUSB                 :  0x200 USB 2.0
 bDeviceClass           :    0x0 Specified at interface
 bDeviceSubClass        :    0x0
 bDeviceProtocol        :    0x0
 bMaxPacketSize0        :    0x8 (8 bytes)
 idVendor               : 0x04fa
 idProduct              : 0x3900
 bcdDevice              :    0x2 Device 0.02
 iManufacturer          :    0x1 Maxim Integrated
 iProduct               :    0x2 DS3900 Module HIDClass
 iSerialNumber          :    0x0
 bNumConfigurations     :    0x1
  CONFIGURATION 1: 100 mA ==================================
   bLength              :    0x9 (9 bytes)
   bDescriptorType      :    0x2 Configuration
   wTotalLength         :   0x29 (41 bytes)
   bNumInterfaces       :    0x1
   bConfigurationValue  :    0x1
   iConfiguration       :    0x0
   bmAttributes         :   0xc0 Self Powered
   bMaxPower            :   0x32 (100 mA)
INTERFACE 0: Human Interface Device ====================                                       [15/521]
     bLength            :    0x9 (9 bytes)
     bDescriptorType    :    0x4 Interface
     bInterfaceNumber   :    0x0
     bAlternateSetting  :    0x0
     bNumEndpoints      :    0x2
     bInterfaceClass    :    0x3 Human Interface Device
     bInterfaceSubClass :    0x0
     bInterfaceProtocol :    0x0
     iInterface         :    0x0
      ENDPOINT 0x81: Interrupt IN ==========================
       bLength          :    0x7 (7 bytes)
       bDescriptorType  :    0x5 Endpoint
       bEndpointAddress :   0x81 IN
       bmAttributes     :    0x3 Interrupt
       wMaxPacketSize   :   0x40 (64 bytes)
       bInterval        :    0x1
      ENDPOINT 0x1: Interrupt OUT ==========================
       bLength          :    0x7 (7 bytes)
       bDescriptorType  :    0x5 Endpoint
       bEndpointAddress :    0x1 OUT
       bmAttributes     :    0x3 Interrupt
       wMaxPacketSize   :   0x40 (64 bytes)
       bInterval        :    0x1

修改代码

import usb.core
import usb.util

vendor_id = 0x04fa
product_id = 0x3900

device = usb.core.find(idVendor=vendor_id, idProduct=product_id)

if device is None:
    raise ValueError("Not Found USB")

interface = 0
endpoint_in = 0x81
endpoint_out = 0x1

device.set_configuration()

try:
    while True:
        try:
            data = device.read(endpoint_out, 64, timeout=1000)
            print("Received data:", data)
            print("bytes data:" , bytes(data))
        except usb.core.USBError as e:
            if e.errno == 110:  # (110: Operation timed out)
                print("Time Out")
                continue
            else:
                raise
finally:
    usb.util.dispose_resources(device)

数据输出

bytes data: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Received data: array('B', [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
bytes data: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Received data: array('B', [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
bytes data: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

相关问题