1. SCPI基础命令与高速接口仪器握手
任务说明
本案例目标是通过pyvisa库连接一台基于VISA协议的仪器(如数字万用表、示波器或信号源),并读取仪器的识别信息(IDN响应),以验证通信链路是否正常。你将学习如何列出可用资源、打开会话、发送SCPI命令并解析返回结果。
实现方案
使用pyvisa库的ResourceManager枚举系统VISA资源,通过open_resource()建立会话,发送标准SCPI识别命令*IDN?并读取响应。代码兼容Windows(NI-VISA或Keysight VISA)与Linux(linux-gpib或ivi)后端,若未安装VISA后端会给出明确提示。
代码实现
import pyvisa
def list_instruments():
"""列出所有可用的VISA资源地址"""
rm = pyvisa.ResourceManager()
resources = rm.list_resources()
if not resources:
print("未检测到任何VISA仪器资源")
return []
print("检测到以下VISA资源:")
for idx, res in enumerate(resources):
print(f" [{idx}] {res}")
return resources
def query_idn(resource_address):
"""连接指定仪器并读取*IDN?响应"""
rm = pyvisa.ResourceManager()
try:
instr = rm.open_resource(resource_address)
# 设置超时(毫秒),避免无限等待
instr.timeout = 3000
# 发送*IDN?并读取响应
idn_response = instr.query("*IDN?")
# 清理返回字符串中的换行与回车
idn_response = idn_response.strip()
print(f"仪器识别信息: {idn_response}")
instr.close()
return idn_response
except pyvisa.Error as e:
print(f"连接或通信失败: {e}")
return None
finally:
rm.close()
if __name__ == "__main__":
# 第一步:列出资源
available = list_instruments()
if not available:
print("请检查:")
print(" 1. 仪器已开机并通过USB/GPIB/LAN连接")
print(" 2. 已安装VISA后端(NI-VISA / Keysight VISA / linux-gpib)")
print(" 3. 使用 pip install pyvisa 安装库")
else:
# 第二步:默认连接第一个资源,也可手动指定地址
target = available[0]
print(f"\n正在连接: {target}")
query_idn(target)
运行与验证
依赖安装:
pip install pyvisa
同时需安装VISA后端运行时(NI-VISA或Keysight VISA),否则ResourceManager()会抛出异常。
执行方式:
python visa_idn.py
验证判定标准:
- 程序能列出至少一个VISA资源地址(如
USB0::0x1AB1::0x0588::DS1ZA123456::INSTR); - 连接后输出以制造商、型号、序列号、固件版本组成的字符串,例如
Keysight Technologies,DSOX1102G,CN12345678,02.43; - 若仪器不支持
*IDN?(极少数老型号),会返回错误信息,此时可改用*IDN或查阅仪器手册确认识别命令。
常见问题排查
- ResourceManager创建失败:未安装VISA后端,需安装NI-VISA或Keysight VISA并重启;
- list_resources()为空:检查仪器驱动是否安装、USB线缆是否识别为VISA设备(Windows设备管理器查看是否有VISA USB设备);
- open_resource超时:确认仪器IP地址/GPIB地址正确,或尝试更换USB端口;
- query返回空:部分仪器需先发送
*CLS清除状态,或增加instr.read_termination = '\n'设置终止符。