You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 11:33:12