【发布时间】:2020-03-25 01:46:00
【问题描述】:
这是一个更新和缩短的问题。
通过PyUSB 与 USB 设备通信应该很容易。所以,我试图在 Win10 下使用 PyUSB 从 USB 设备(示波器)读取数据。显然,自从找到设备以来,USB 驱动程序(libusb-win32 v1.2.6.0)已正确安装,我收到了来自print(dev) 的一些回复(见下文)。
从这里我可以看到输出端点地址是0x3,输入端点地址是0x81
根据Oscilloscope manual,我应该将:SDSLSCPI# 发送到设备以将其设置为SCPI 模式并且应该得到响应':SCPION'。
但是,当发送:SDSLSCPI# 时,示波器的监视器会冻结并重新启动。
如果我发送*IDN?,我应该会收到回复,P1337,1842237,V2.4.0->。但前提是设备已经处于 SCPI 模式。显然,它不是,我得到一个超时错误(见下文)。
那么,我在这里做错了什么? 我在PyUSB tutorial 中缺少什么信息。 我使用了错误的 PyUSB 命令/参数,还是缺少其他驱动程序,还是与硬件有关,无论是 Win10 还是设备硬件?感谢您提供有关如何找出问题所在的提示。
顺便问一下,dev.read(0x81,7) 中的第二个值是多少?要读取的字节数?好吧,通常我不知道设备会发送多少字节。我期待一个命令在超时时间内读取到换行符或其他终止符。我在哪里可以找到有关 PyUSB 的“万无一失”的文档、教程和示例?
代码:
import usb.core
import usb.util
dev = usb.core.find(idVendor=0x5345, idProduct=0x1234)
if dev is None:
raise ValueError('Device is not found')
# device is found :-)
print(dev)
dev.set_configuration()
msg = ':SDSLSCPI#'
print("Write:", msg, dev.write(3,msg))
print("Read:", dev.read(0x81,7))
来自print(dev)的输出:
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
错误信息:
Traceback (most recent call last):
File "Osci.py", line 15, in <module>
print("Read:", dev.read(0x81,7))
File "C:\Users\Test\Programs\Python3.7.4\lib\site-packages\usb\core.py", line 988, in read
self.__get_timeout(timeout))
File "C:\Users\Test\Programs\Python3.7.4\lib\site-packages\usb\backend\libusb0.py", line 542, in bulk_read
timeout)
File "C:\Users\Test\Programs\Python3.7.4\lib\site-packages\usb\backend\libusb0.py", line 627, in __read
timeout
File "C:\Users\Test\Programs\Python3.7.4\lib\site-packages\usb\backend\libusb0.py", line 431, in _check
raise USBError(errmsg, ret)
usb.core.USBError: [Errno None] b'libusb0-dll:err [_usb_reap_async] timeout error\n'
更新:
我收到了供应商的回复。他确认示波器(或至少这个特定系列)在发送命令:SDSLSCPI# 时崩溃。他将联系下周回来的开发商。好的,到目前为止,我似乎没有机会让它与这个特定的设备和可用的文档一起运行:-(。
【问题讨论】:
-
我认为你混合了端点。尝试写入 0x81 并从 0x03 读取。
-
好吧,我很确定地址是正确的。与此同时,我可以通过发送
*IDN?获得序列号,但是,其他 SCPI 命令仍然会产生超时错误。我怀疑实际上不需要发送:SDSLSCPI#。整件事很烦人也很奇怪...... -
如果您收到任何响应,则说明通信通道设置正确,pyUSB 没有问题。所以它正在寻找设备的通用语言;)你确定它支持 SCPI 模式吗?如果设备不支持 SCPI,文档中的 BC 将不会返回任何内容。
-
我被告知该设备可以理解 SCPI。至少它理解
*IDN?。但根据文档,其他列出的命令也应该给出一些响应。我需要下周再检查一次。