Python捕获Agilent示波器截图时read_raw报print cancel错误求助
安捷伦示波器Python采集截图报“print cancel”排查方案
报错本质是示波器硬拷贝输出流程被意外中断,二进制截图数据未完成传输就终止输出,全部由代码配置、语法错误导致。
具体问题点
- 设备连接逻辑缺失:代码只定义了VISA地址常量,没有调用
open_resource绑定目标示波器,后续的读写操作根本没有对应到实体设备。 - 终止符配置冲突:提前给接口设置
read_termination='\n',二进制PNG数据流里只要出现0x0A(即\n对应的字节值)就会被判定为读取结束,直接截断传输,示波器检测到连接异常就会取消打印任务。 - SCPI指令格式错误:写的
:HARDcopy: STARt冒号后多了冗余空格,示波器无法识别指令;没有指定硬拷贝输出目标为VISA接口,部分型号默认把截图输出到本地U盘/机身存储,根本不会向上位机传数据。 - 基础语法错误:文件打开语句
open ('Shot.png' 'wb')两个参数之间漏了逗号,无法正常创建文件;VISA DLL路径里的Windows反斜杠没有做转义处理,存在路径识别失败的风险。 - 时序不匹配:发送截图启动指令后没有留够示波器生成截图的时间,直接调用
read_raw会在设备还没准备好数据时就发起读取,触发传输中断。
修正后代码
import pyvisa as visa import time VISA_ADDRESS = 'USB0::0x2A8D::0x1797::CN57046145::0::INSTR' # 路径前加r前缀避免反斜杠转义问题 rm = visa.ResourceManager(r'C:\Windows\System32\visa32.dll') scope = rm.open_resource(VISA_ADDRESS) # 二进制传输时不要设置读终止符,避免截断数据流,仅保留写终止符即可 scope.write_termination = '\n' scope.timeout = 10000 # 设置10秒超时,留足截图生成、传输的时间 # 校验连接状态 print(scope.query('*IDN?')) # 配置截图参数 scope.write('SAVE:IMAG:FILEF PNG') scope.write(':HARDcopy:INKSaver OFF') scope.write(':HARDcopy:STARt') # 等待1秒让示波器完成截图渲染 time.sleep(1) # 读取二进制数据写入文件 raw_data = scope.read_raw() with open('Shot.png', 'wb') as f: f.write(raw_data) scope.close()
补充说明
- 如果运行后依然报错,可以先手动操作示波器面板,把硬拷贝的输出目标修改为「PC/USB」,再运行代码。
- 不同批次、型号的安捷伦示波器SCPI指令存在细微差异,如果出现指令不识别的情况,对照对应型号的编程手册调整
:HARDcopy下的子指令即可。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

