You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派4B使用PyVisa 1.10.0连接数字万用表时二次运行出现USBError

树莓派4B上PyVisa 1.10.0与数字万用表的USB连接异常问题

问题描述

在树莓派4B上使用Python 3.7和PyVisa 1.10.0版本连接数字万用表时,出现以下异常:首次运行代码功能正常,但第二次运行必定触发USBError(操作超时)。已启用PyVisa日志但未发现有效排查线索。由于需要兼容旧代码,必须保留当前PyVisa和Python版本,且树莓派处于离线状态无法联网更新。

测试代码

import pyvisa
import time
import visa

visa.log_to_screen()
rm = pyvisa.ResourceManager('@py') # 使用pyvisa-py后端
myInstrument = rm.open_resource('MY:ADDRESS')
myInstrument.timeout = 0
myInstrument.read_termination = '\n'
myInstrument.write_termination = '\n'

print(pyvisa.__version__)

# 启用远程命令
myInstrument.write("SYSTem:REMote")

myInstrument.write("MEAS:VOLT:DC? AUTO")
time.sleep(1)

for i in range(1):
    fullReadingLine = myInstrument.query("READ?")
    print(f"Value: {fullReadingLine} ")
    time.sleep(0.5)

myInstrument.close()
rm.close()

控制台日志输出

pi@raspberrypi:~/Documents/new_testTool $ python3 pyvisa-test.py
2022-08-31 22:11:50,205 - pyvisa - DEBUG - SerialSession was correctly imported.
2022-08-31 22:11:50,248 - pyvisa - DEBUG - USBSession and USBRawSession were correctly imported.
2022-08-31 22:11:50,257 - pyvisa - DEBUG - TCPIPSession was correctly imported.
2022-08-31 22:11:50,259 - pyvisa - DEBUG - GPIBSession was not imported No module named 'gpib'.
2022-08-31 22:11:50,260 - pyvisa - DEBUG - Created library wrapper for unset
2022-08-31 22:11:50,260 - pyvisa - DEBUG - Created ResourceManager with session 4293804
2022-08-31 22:11:50,261 - pyvisa - DEBUG - MY:ADDRESS - opening ...
2022-08-31 22:11:50,534 - pyvisa - DEBUG - MY:ADDRESS - is open with session 7581094
1.10.0
2022-08-31 22:11:51,538 - pyvisa - DEBUG - USB0::2733::309::037282696::0::INSTR - reading 20480 bytes (last status <StatusCode.success_max_count_read: 1073676294>)
Value: 8.60307000E-03
2022-08-31 22:11:52,339 - pyvisa - DEBUG - MY:ADDRESS - closing
2022-08-31 22:11:52,340 - pyvisa - DEBUG - MY:ADDRESS - is closed
2022-08-31 22:11:52,340 - pyvisa - DEBUG - Closing ResourceManager (session: 4293804)
2022-08-31 22:11:52,341 - pyvisa - DEBUG - MY:ADDRESS - closing
pi@raspberrypi:~/Documents/new_testTool $ python3 pyvisa-test.py
2022-08-31 22:22:03,881 - pyvisa - DEBUG - SerialSession was correctly imported.
2022-08-31 22:22:03,922 - pyvisa - DEBUG - USBSession and USBRawSession were correctly imported.
2022-08-31 22:22:03,931 - pyvisa - DEBUG - TCPIPSession was correctly imported.
2022-08-31 22:22:03,933 - pyvisa - DEBUG - GPIBSession was not imported No module named 'gpib'.
2022-08-31 22:22:03,933 - pyvisa - DEBUG - Created library wrapper for unset
2022-08-31 22:22:03,934 - pyvisa - DEBUG - Created ResourceManager with session 9517076
2022-08-31 22:22:03,934 - pyvisa - DEBUG - MY:ADDRESS - opening ...
2022-08-31 22:22:04,204 - pyvisa - DEBUG - MY:ADDRESS - is open with session 5006259
1.10.0
Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.7/site-packages/pyvisa-py/protocols/usbtmc.py", line 225, in write
    return self.usb_send_ep.write(data)
  File "/home/pi/.local/lib/python3.7/site-packages/usb/core.py", line 387, in write
    return self.device.write(self, data, timeout)
  File "/home/pi/.local/lib/python3.7/site-packages/usb/core.py", line 948, in write
    self.__get_timeout(timeout)
  File "/home/pi/.local/lib/python3.7/site-packages/usb/backend/libusb1.py", line 824, in bulk_write
    timeout)
  File "/home/pi/.local/lib/python3.7/site-packages/usb/backend/libusb1.py", line 920, in __write
    _check(retval)
  File "/home/pi/.local/lib/python3.7/site-packages/usb/backend/libusb1.py", line 595, in _check
    raise USBError(_strerror(ret), ret, _libusb_errno[ret])
usb.core.USBError: [Errno 110] Operation timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "pyvisa-test.py", line 21, in <module>
    fullReadingLine = myInstrument.query("READ?")
  File "/home/pi/.local/lib/python3.7/site-packages/pyvisa/resources/messagebased.py", line 594, in query
    self.write(message)
  File "/home/pi/.local/lib/python3.7/site-packages/pyvisa/resources/messagebased.py", line 224, in write
    count = self.write_raw(message.encode(enco))
  File "/home/pi/.local/lib/python3.7/site-packages/pyvisa/resources/messagebased.py", line 202, in write_raw
    return self.visalib.write(self.session, message)
  File "/home/pi/.local/lib/python3.7/site-packages/pyvisa-py/highlevel.py", line 368, in write
    ret = self.sessions[session].write(data)
  File "/home/pi/.local/lib/python3.7/site-packages/pyvisa-py/usb.py", line 126, in write
    count = self.interface.write(data)
  File "/home/pi/.local/lib/python3.7/site-packages/pyvisa-py/protocols/usbtmc.py", line 314, in write
    bytes_sent += raw_write(data)
  File "/home/pi/.local/lib/python3.7/site-packages/pyvisa-py/protocols/usbtmc.py", line 227, in write
    raise ValueError(str(e))
ValueError: [Errno 110] Operation timed out
2022-08-31 22:22:06,267 - pyvisa - DEBUG - MY:ADDRESS - closing
2022-08-31 22:22:06,268 - pyvisa - DEBUG - MY:ADDRESS - is closed
2022-08-31 22:22:06,301 - pyvisa - DEBUG - Closing ResourceManager (session: 9517076)
pi@raspberrypi:~/Documents/new_testTool $

离线环境下的解决方案

1. 强制重置USB设备

从日志可见首次运行后存在重复关闭设备的记录,说明资源释放不彻底。可在代码末尾添加USB设备重置逻辑(需提前通过lsusb获取设备的VID和PID):

import usb.core
import usb.util

# 替换为你的设备VID和PID
dev = usb.core.find(idVendor=0x2733, idProduct=0x0309)
if dev is not None:
    dev.reset()

2. 调整超时参数

当前代码设置timeout=0(无限超时),可能导致第二次连接时设备处于异常状态无法响应。改为合理的超时值:

myInstrument.timeout = 5000  # 5秒超时

3. 优化资源释放流程

使用try-finally块确保异常情况下也能正确关闭设备,避免资源泄漏:

import pyvisa
import time

pyvisa.log_to_screen()
rm = pyvisa.ResourceManager('@py')
myInstrument = None
try:
    myInstrument = rm.open_resource('MY:ADDRESS')
    myInstrument.timeout = 5000
    myInstrument.read_termination = '\n'
    myInstrument.write_termination = '\n'

    print(pyvisa.__version__)

    myInstrument.write("SYSTem:REMote")
    myInstrument.write("MEAS:VOLT:DC? AUTO")
    time.sleep(1)

    fullReadingLine = myInstrument.query("READ?")
    print(f"Value: {fullReadingLine} ")
    time.sleep(0.5)
finally:
    if myInstrument is not None:
        myInstrument.close()
    rm.close()

4. 修复模块导入冲突

代码中同时导入pyvisa和visa可能引发资源冲突,移除import visa,并将日志调用改为pyvisa.log_to_screen()。

5. 检查USB权限

确保当前用户拥有USB设备读写权限,执行以下命令后重启树莓派:

sudo usermod -aG plugdev pi

内容的提问来源于stack exchange,提问作者XaniXxable

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:45:44