PyVisa USB超时错误无法在不重新启动的情况下清除



我需要一些关于如何处理USB超时错误的建议。

我正在开发一个应用程序,该应用程序通过USB-GPIB端口与我的安立仪器通信。该应用程序运行良好,我以固定的间隔定期读取结果。然而,有时我会在仪器读取过程中意外地调用Read_data函数。这会引发超时错误,应用程序将停止。当我重新启动应用程序时,pyvisa会找到仪器并连接到它。第一个命令是读取*IDN?,但在第一次阅读时,我得到了以下错误:

('USB0::1003::8293::ANRITSU_0_0000::0::INSTR',)
Found VNA USB0::1003::8293::ANRITSU_0_0000::0::INSTR
Attached
[2022-09-17 23:14:31,349] ERROR in app: Exception on / [GET]
Traceback (most recent call last):
File "/usr/local/share/pynq-venv/lib/python3.8/site-packages/pyvisa_py/protoco                                                                                                             ls/usbtmc.py", line 256, in write
return self.usb_send_ep.write(data)
File "/usr/local/share/pynq-venv/lib/python3.8/site-packages/usb/core.py", lin                                                                                                             e 408, in write
return self.device.write(self, data, timeout)
File "/usr/local/share/pynq-venv/lib/python3.8/site-packages/usb/core.py", lin                                                                                                             e 989, in write
return fn(
File "/usr/local/share/pynq-venv/lib/python3.8/site-packages/usb/backend/libus                                                                                                             b1.py", line 837, in bulk_write
return self.__write(self.lib.libusb_bulk_transfer,
File "/usr/local/share/pynq-venv/lib/python3.8/site-packages/usb/backend/libus                                                                                                             b1.py", line 938, in __write
_check(retval)
File "/usr/local/share/pynq-venv/lib/python3.8/site-packages/usb/backend/libus                                                                                                             b1.py", line 602, in _check
raise USBTimeoutError(_strerror(ret), ret, _libusb_errno[ret])

usb.core.USBTimeoutError: [Errno 110] Operation timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/local/share/pynq-venv/lib/python3.8/site-packages/flask/app.py", li                                                                                                             ne 2070, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/share/pynq-venv/lib/python3.8/site-packages/flask/app.py", li                                                                                                             ne 1508, in full_dispatch_request
self.try_trigger_before_first_request_functions()
File "/usr/local/share/pynq-venv/lib/python3.8/site-packages/flask/app.py", li                                                                                                             ne 1560, in try_trigger_before_first_request_functions
self.ensure_sync(func)()
File "/home/xilinx/Anritsu_GPIB/VNA/routes.py", line 44, in intialize_VNA
print(anritsu.VNA.query('*IDN?'))
File "/usr/local/share/pynq-venv/lib/python3.8/site-packages/pyvisa/resources/                                                                                                             messagebased.py", line 642, in query
self.write(message)
File "/usr/local/share/pynq-venv/lib/python3.8/site-packages/pyvisa/resources/                                                                                                             messagebased.py", line 197, in write
count = self.write_raw(message.encode(enco))
File "/usr/local/share/pynq-venv/lib/python3.8/site-packages/pyvisa/resources/                                                                                                             messagebased.py", line 157, in write_raw
return self.visalib.write(self.session, message)[0]
File "/usr/local/share/pynq-venv/lib/python3.8/site-packages/pyvisa_py/highlev                                                                                                             el.py", line 543, in write
written, status_code = self.sessions[session].write(data)
File "/usr/local/share/pynq-venv/lib/python3.8/site-packages/pyvisa_py/usb.py"                                                                                                             , line 179, in write
count = self.interface.write(data)
File "/usr/local/share/pynq-venv/lib/python3.8/site-packages/pyvisa_py/protoco                                                                                                             ls/usbtmc.py", line 436, in write
bytes_sent += raw_write(data)
File "/usr/local/share/pynq-venv/lib/python3.8/site-packages/pyvisa_py/protoco                                                                                                             ls/usbtmc.py", line 258, in write
raise ValueError(str(e))
ValueError: [Errno 110] Operation timed out

这种情况一直持续到我完全重新启动为止。我找不到清除这个错误的方法。有人对如何调试这个问题有什么建议吗。

谢谢。

当遇到Operation timed out时,通常是以下两种情况之一:

  1. 仪器正忙。当你重新启动应用程序时,也许你的仪器仍在工作?我认为这可能不是事实
  2. 仪器状态不好,因为它早些时候收到了一个错误的命令。这是最有可能的问题,因为重新启动可以解决它

我不熟悉安立设备,但我建议使用以下方法之一来避免在仪器准备好之前进行查询:

首先,许多机器支持GPIB*OPC?查询,这意味着"操作完成";。触发作业/测量开始后,可以循环使用*OPC?查询,直到得到良好的响应。然后你知道机器已经准备好报告了,你就可以read_data了。这有时需要捕获GPIB超时并重试(取决于机器响应(。

其次,大多数机器在其状态字节中放入更新,可以在不中断仪器的情况下读取更新。使用GPIB*STB?查询来获取仪器的当前状态字节。您必须阅读特定仪器的手册才能理解每一位的含义。通常,有一个错误,另一个错误表明测试正在进行或完成。

第三,如果您无法提前知道仪器是否准备好,您可以查询仪器并希望(就像您现在所做的那样(。如果机器由于错误状态而变得无响应,您可以使用GPIB*RST命令将其重置。它应该具有与重新启动相同的效果,但您可以直接将其编程到代码中。

相关内容

最新更新