树莓派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
相关产品推荐
相关产品推荐

