在使用python的pyvisa库函数通过visa指令控制仪器时,出现‘pyvisa.errors.VisaIOError: VI_ERROR_TMO (-1073807339): Timeout expired before operation completed.’的报错。而用设备的visa工具软件时,一切正常。源码如下:
import pyvisa
address = 'TCPIP0::172.18.6.255::5025::SOCKET'
resourceManager = pyvisa.ResourceManager()
instance = resourceManager.open_resource(address)
print('Connect %s succeed!' % address)
res = instance.query('*IDN?')
print('Read ID: ' + res)
instance.close()
报错的内容如下:
Traceback (most recent call last):
File "D:/brain/Python/Keysight_OMA.py", line 18, in <module>
res = instance.query('*IDN?')
File "D:\brain\Python\venv\lib\site-packages\pyvisa\resources\messagebased.py", line 648, in query
return self.read()
File "D:\brain\Python\venv\lib\site-packages\pyvisa\resources\messagebased.py", line 486, in read
message = self._read_raw().decode(enco)
File "D:\brain\Python\venv\lib\site-packages\pyvisa\resources\messagebased.py", line 442, in _read_raw
chunk, status = self.visalib.read(self.session, size)
File "D:\brain\Python\venv\lib\site-packages\pyvisa\ctwrapper\functions.py", line 2337, in read
ret = library.viRead(session, buffer, count, byref(return_count))
File "D:\brain\Python\venv\lib\site-packages\pyvisa\ctwrapper\highlevel.py", line 226, in _return_handler
return self.handle_return_value(session, ret_value) # type: ignore
File "D:\brain\Python\venv\lib\site-packages\pyvisa\highlevel.py", line 251, in handle_return_value
raise errors.VisaIOError(rv)
pyvisa.errors.VisaIOError: VI_ERROR_TMO (-1073807339): Timeout expired before operation completed.
网上搜索了很久,找到一篇国外程序员讨论该问题的帖子,在里面发现有一段提到需要在打开设备后,定义write和read的终止符。于是增加了如下两段:
instance.write_termination = "\n" instance.read_termination = "\n"
修改后的代码为:
import pyvisa
address = 'TCPIP0::172.18.6.255::5025::SOCKET'
resourceManager = pyvisa.ResourceManager()
instance = resourceManager.open_resource(address)
print('Connect %s succeed!' % address)
instance.write_termination = "\n"
instance.read_termination = "\n"
res = instance.query('*IDN?')
print('Read ID: ' + res)
instance.close()
运行结果正确,debug成功!特此记录一下。
Pass:有些设备不需要指定这个终止符也可以正常通讯, 看情况而定吧。