Python控制RIGOL DS2302A示波器遇VI_ERROR_TMO超时错误求助
解决RIGOL DS2302A示波器PyVisa读取超时问题
你遇到的错误是:
pyvisa.errors.VisaIOError: VI_ERROR_TMO (-1073807339): Timeout expired before operation completed.
延长超时参数无效,可从以下几个方面排查修复:
1. 修正SCPI命令终止符
RIGOL示波器默认的SCPI命令终止符是\r\n,你的代码中设置的write_termination = '\r'不匹配,会导致命令无法被正确识别,进而引发超时。修改为:
scope.read_termination = '\r\n' scope.write_termination = '\r\n'
2. 用PyVisa内置方法读取二进制数据
手动解析CURVE?的二进制表头容易出错,改用query_binary_values可以自动处理RIGOL的二进制格式,避免手动处理表头的问题,同时更稳定:
替换原代码中scope.write('CURVE?')到ADC_wave = np.array(...)的部分为:
# 直接读取并解析二进制曲线数据 ADC_wave = scope.query_binary_values('CURVE?', datatype='B', container=np.array)
3. 限制采集数据点数量
示波器默认采集的点数可能过多,导致数据传输超时,可提前设置数据点数量:
# 在设置DATA相关参数后添加 scope.write('DATA:POINTS 1000') # 可根据需求调整点数,比如2000、5000等
4. 检查网络连接稳定性
- 确认电脑与示波器在同一局域网,IP地址
169.254.94.149正确且能ping通 - 关闭电脑防火墙,或添加PyVisa相关进程的网络例外
- 尝试重启示波器和电脑的网络连接
修改后的完整代码
import pyvisa import numpy as np import pylab rm = pyvisa.ResourceManager() print(rm.list_resources()) scope = rm.open_resource('TCPIP::169.254.94.149::INSTR') # oscilloscope IP scope.timeout = 10000 # ms scope.encoding = 'latin_1' # 修正终止符 scope.read_termination = '\r\n' scope.write_termination = '\r\n' print(scope.query('*IDN?')) scope.write('DATA:SOU CH1') scope.write('DATA:WIDTH 1') scope.write('DATA:ENC RPB') # 限制数据点数量 scope.write('DATA:POINTS 1000') ymult = float(scope.query('WFMPRE:YMULT?')) # y-axis least count yzero = float(scope.query('WFMPRE:YZERO?')) # y-axis zero error yoff = float(scope.query('WFMPRE:YOFF?')) # y-axis offset xincr = float(scope.query('WFMPRE:XINCR?')) # x-axis least count # 改用query_binary_values读取数据 ADC_wave = scope.query_binary_values('CURVE?', datatype='B', container=np.array) Volts = (ADC_wave - yoff) * ymult + yzero Time = np.arange(0, xincr * len(Volts), xincr) # 绘制波形 pylab.plot(Time, Volts) pylab.show()
内容的提问来源于stack exchange,提问作者f.cerkesli
相关产品推荐
相关产品推荐

