小能豆

PyUSB:与 OWON 示波器通信(2)

py

USB 驱动程序似乎已安装,至少 Windows10 让我相信这一点。

1.png

可以从 PeakTech 主页下载的软件 (DS_Wave V2.2.2) 似乎无法使用。当尝试通过该软件远程连接设备时,会导致示波器“崩溃”/重启。

无论如何,我不想使用他们的软件,但我想通过 pyUSB 来处理示波器。

这个小型 Python 程序在第一台电脑上运行良好,但在第二台电脑上却无法运行。

### communicate with a Peaktech 1337 Oscilloscope (OWON)
import usb.core
import usb.util
from usb.backend import libusb1

def send(dev,cmd):
    # address taken from results of print(dev):   ENDPOINT 0x3: Bulk OUT
    dev.write(3,cmd+'\r')
    # address taken from results of print(dev):   ENDPOINT 0x81: Bulk IN
    result = (dev.read(0x81,10000,1000)).tobytes().decode('utf-8')[:-4]
    return result

back = libusb1.get_backend()
print(type(back))

dev = usb.core.find(idVendor=0x5345, idProduct=0x1234, backend=back)
print(dev)
dev.set_configuration()

print(send(dev,"*IDN?"))
### end of script

PC1上的结果:(Python 3.7.4)

<class 'NoneType'>

DEVICE ID 5345:1234 on Bus 000 Address 001 =================
 bLength                :   0x12 (18 bytes)
 bDescriptorType        :    0x1 Device
 bcdUSB                 :  0x200 USB 2.0
 bDeviceClass           :    0x0 Specified at interface
 bDeviceSubClass        :    0x0
 bDeviceProtocol        :    0x0
 bMaxPacketSize0        :   0x40 (64 bytes)
 idVendor               : 0x5345
 idProduct              : 0x1234
 bcdDevice              :  0x294 Device 2.94
 iManufacturer          :    0x1 System CPU
 iProduct               :    0x2 Oscilloscope
 iSerialNumber          :    0x3 SERIAL
 bNumConfigurations     :    0x1
  CONFIGURATION 1: 500 mA ==================================
   bLength              :    0x9 (9 bytes)
   bDescriptorType      :    0x2 Configuration
   wTotalLength         :   0x20 (32 bytes)
   bNumInterfaces       :    0x1
   bConfigurationValue  :    0x1
   iConfiguration       :    0x5 Bulk Data Configuration
   bmAttributes         :   0xc0 Self Powered
   bMaxPower            :   0xfa (500 mA)
    INTERFACE 0: Physical ==================================
     bLength            :    0x9 (9 bytes)
     bDescriptorType    :    0x4 Interface
     bInterfaceNumber   :    0x0
     bAlternateSetting  :    0x0
     bNumEndpoints      :    0x2
     bInterfaceClass    :    0x5 Physical
     bInterfaceSubClass :    0x6
     bInterfaceProtocol :   0x50
     iInterface         :    0x4 Bulk Data Interface
      ENDPOINT 0x81: Bulk IN ===============================
       bLength          :    0x7 (7 bytes)
       bDescriptorType  :    0x5 Endpoint
       bEndpointAddress :   0x81 IN
       bmAttributes     :    0x2 Bulk
       wMaxPacketSize   :  0x200 (512 bytes)
       bInterval        :    0x0
      ENDPOINT 0x3: Bulk OUT ===============================
       bLength          :    0x7 (7 bytes)
       bDescriptorType  :    0x5 Endpoint
       bEndpointAddress :    0x3 OUT
       bmAttributes     :    0x2 Bulk
       wMaxPacketSize   :  0x200 (512 bytes)
       bInterval        :    0x0

,P1337,1842237,V2.4.     # <--- that's the response I'm expecting after sending `*IDN?`

PC2上的结果:(Python 3.10.7)

<class 'usb.backend.libusb1._LibUSB'>

DEVICE ID 5345:1234 on Bus 001 Address 049 =================
 bLength                :   0x12 (18 bytes)
 bDescriptorType        :    0x1 Device
 bcdUSB                 :  0x200 USB 2.0
 bDeviceClass           :    0x0 Specified at interface
 bDeviceSubClass        :    0x0
 bDeviceProtocol        :    0x0
 bMaxPacketSize0        :   0x40 (64 bytes)
 idVendor               : 0x5345
 idProduct              : 0x1234
 bcdDevice              :  0x294 Device 2.94
 iManufacturer          :    0x1 Error Accessing String
 iProduct               :    0x2 Error Accessing String
 iSerialNumber          :    0x3 Error Accessing String
 bNumConfigurations     :    0x1
  CONFIGURATION 1: 500 mA ==================================
   bLength              :    0x9 (9 bytes)
   bDescriptorType      :    0x2 Configuration
   wTotalLength         :   0x20 (32 bytes)
   bNumInterfaces       :    0x1
   bConfigurationValue  :    0x1
   iConfiguration       :    0x5 Error Accessing String
   bmAttributes         :   0xc0 Self Powered
   bMaxPower            :   0xfa (500 mA)
    INTERFACE 0: Physical ==================================
     bLength            :    0x9 (9 bytes)
     bDescriptorType    :    0x4 Interface
     bInterfaceNumber   :    0x0
     bAlternateSetting  :    0x0
     bNumEndpoints      :    0x2
     bInterfaceClass    :    0x5 Physical
     bInterfaceSubClass :    0x6
     bInterfaceProtocol :   0x50
     iInterface         :    0x4 Error Accessing String
      ENDPOINT 0x81: Bulk IN ===============================
       bLength          :    0x7 (7 bytes)
       bDescriptorType  :    0x5 Endpoint
       bEndpointAddress :   0x81 IN
       bmAttributes     :    0x2 Bulk
       wMaxPacketSize   :  0x200 (512 bytes)
       bInterval        :    0x0
      ENDPOINT 0x3: Bulk OUT ===============================
       bLength          :    0x7 (7 bytes)
       bDescriptorType  :    0x5 Endpoint
       bEndpointAddress :    0x3 OUT
       bmAttributes     :    0x2 Bulk
       wMaxPacketSize   :  0x200 (512 bytes)
       bInterval        :    0x0

Traceback (most recent call last):
  File "C:\Users\Lab\Programs\Test\Test_PeakTech.py", line 18, in <module>
    dev.set_configuration()
  File "C:\Users\Lab\AppData\Local\Programs\Python\Python310\lib\site-packages\usb\core.py", line 915, in set_configuration
    self._ctx.managed_set_configuration(self, configuration)
  File "C:\Users\Lab\AppData\Local\Programs\Python\Python310\lib\site-packages\usb\core.py", line 113, in wrapper
    return f(self, *args, **kwargs)
  File "C:\Users\Lab\AppData\Local\Programs\Python\Python310\lib\site-packages\usb\core.py", line 158, in managed_set_configuration
    self.managed_open()
  File "C:\Users\Lab\AppData\Local\Programs\Python\Python310\lib\site-packages\usb\core.py", line 113, in wrapper
    return f(self, *args, **kwargs)
  File "C:\Users\Lab\AppData\Local\Programs\Python\Python310\lib\site-packages\usb\core.py", line 131, in managed_open
    self.handle = self.backend.open_device(self.dev)
  File "C:\Users\Lab\AppData\Local\Programs\Python\Python310\lib\site-packages\usb\backend\libusb1.py", line 804, in open_device
    return _DeviceHandle(dev)
  File "C:\Users\Lab\AppData\Local\Programs\Python\Python310\lib\site-packages\usb\backend\libusb1.py", line 652, in __init__
    _check(_lib.libusb_open(self.devid, byref(self.handle)))
  File "C:\Users\Lab\AppData\Local\Programs\Python\Python310\lib\site-packages\usb\backend\libusb1.py", line 604, in _check
    raise USBError(_strerror(ret), ret, _libusb_errno[ret])
usb.core.USBError: [Errno 13] Access denied (insufficient permissions)

这是怎么回事?我没主意了,浪费时间

  • 哪种访问以及为什么被拒绝?
  • 我是在正确的位置安装了错误的驱动程序,还是在错误的位置安装了正确的驱动程序?
  • 这可能是 Python 3.7.4 和 3.10.7 之间的问题吗?
  • 是否需要任何其他信息来找出实际问题是什么?

阅读 24

收藏
2025-01-05

共1个答案

小能豆

这个问题的根源似乎是权限问题。在第二台电脑上,错误提示 usb.core.USBError: [Errno 13] Access denied (insufficient permissions) 表示程序尝试访问 USB 设备时权限不足。以下是一些可能的原因和解决方法:

1. 权限问题

Windows 10 上的 USB 设备访问权限有时会受到限制,特别是在没有管理员权限时。可以尝试以下解决方法:

  • 以管理员身份运行脚本:右键单击 Python 解释器或命令提示符,选择“以管理员身份运行”,然后再尝试运行脚本。
  • 给当前用户提供 USB 设备访问权限
    • 在设备管理器中找到你的 USB 设备,右键点击,选择“属性”,然后检查是否有权限设置(这通常用于安装设备驱动时)。
    • 确保 libusb 驱动程序或类似驱动程序正确安装,并且允许当前用户访问。

2. 驱动程序问题

驱动程序的安装可能存在问题,尤其是在不同的操作系统或硬件上,可能会影响设备的正常工作。你可以尝试以下步骤:

  • 确认第二台电脑上的驱动程序是否已正确安装。你提到你不想使用 PeakTech 提供的软件,但可能仍然需要安装某些专用的驱动程序来确保设备能够正常工作。
  • 检查 libusb 驱动程序是否安装正确
    • 在第二台电脑上,尝试重新安装 libusb 或者使用 Zadig 工具重新安装驱动程序,以确保正确的 USB 驱动程序与设备匹配。

3. Python 版本问题

不同的 Python 版本可能会影响 pyusb 库的行为。虽然 Python 3.7 和 3.10 应该可以正常运行 pyusb,但它们之间的差异可能导致不同的结果。可以尝试以下方法:

  • 检查 pyusblibusb1 的版本

    • 确保在第二台电脑上安装了与第一台电脑相同版本的 pyusblibusb1
    • 运行以下命令检查版本:
      bash pip show pyusb pip show libusb1
  • 在 Python 3.7 下测试:你可以在第二台电脑上安装 Python 3.7 并测试该脚本,查看是否能解决问题。

4. 使用 pyusb 时的权限配置

有时,即使设备连接正确,pyusb 可能也会因为权限问题无法打开设备。你可以尝试以下方法:

  • 在 Python 脚本中使用 usb.core.find() 时指定权限
    • 尝试设置一个合适的权限来确保设备的访问。例如:
      python dev.set_configuration() dev.write(3, cmd+'\r', timeout=1000) # Use appropriate timeout

5. 设备的连接和配置问题

  • 确保设备在第二台电脑上已正确连接,并且通过设备管理器可见。如果设备没有被正确识别,可能会出现类似问题。
  • 检查 dev.set_configuration() 调用之前,是否设备已被正确配置并能正常工作。

如果你继续遇到问题,请提供更多的细节,比如设备管理器中的设备状态,或者其他错误日志,这样能更容易找到问题的根源。

2025-01-05