1. 使用PyVISA连接并识别仪器
任务说明
本案例目标是通过PyVISA库建立计算机与可编程仪器(如数字万用表、示波器、信号源等)之间的通信连接,并读取仪器的身份标识信息(IDN)。完成本案例后,你将能够:检测系统可用的VISA后端与资源、打开与仪器的会话、发送标准SCPI命令并正确解析返回结果。
实现方案
PyVISA是Python访问VISA(Virtual Instrument Software Architecture)的标准库。本案例采用最小可复现实现:使用pyvisa库列出所有可用资源,通过用户指定的资源地址(如USB0::0x1234::0x5678::INSTR或TCPIP0::192.168.1.100::INSTR)建立连接,发送*IDN?命令读取仪器返回的厂商、型号、序列号与固件版本信息。代码不依赖任何未展示的前置代码,所有依赖仅在下方说明。
代码实现
import pyvisa
def list_resources():
"""列出当前主机所有可用的VISA资源地址"""
rm = pyvisa.ResourceManager()
resources = rm.list_resources()
return resources
def identify_instrument(resource_address):
"""
连接指定地址的仪器并读取*IDN?响应
参数:
resource_address: str, VISA资源地址,例如 'USB0::0x1234::0x5678::INSTR'
返回:
(仪器IDN字符串, 连接是否成功)
"""
rm = pyvisa.ResourceManager()
try:
# 打开与仪器的会话,超时设为5秒
instr = rm.open_resource(resource_address)
instr.timeout = 5000
# 发送标准SCPI识别命令
idn_response = instr.query("*IDN?")
# 关闭会话释放资源
instr.close()
return idn_response.strip(), True
except pyvisa.Error as e:
return f"连接失败: {str(e)}", False
if __name__ == "__main__":
# 第一步:查看可用资源
available = list_resources()
print("检测到的VISA资源:")
for i, res in enumerate(available):
print(f" [{i}] {res}")
if not available:
print("未检测到任何VISA资源,请检查仪器连接与驱动安装。")
else:
# 第二步:默认使用第一个资源进行识别(可手动修改为实际仪器地址)
target = available[0]
print(f"\n正在连接: {target}")
idn, ok = identify_instrument(target)
if ok:
print(f"仪器识别成功: {idn}")
else:
print(idn)
依赖与运行环境
- Python 3.7+
- 安装PyVISA:
pip install pyvisa - 安装VISA后端(二选一):
- NI-VISA(Windows/Linux/macOS,推荐)
- pyvisa-py(纯Python后端):
pip install pyvisa-py
- 物理连接:仪器通过USB、GPIB、LAN或串口与计算机相连,并已安装对应驱动
运行与验证
python visa_identify.py
验证步骤与判定标准:
- 程序首先打印当前主机检测到的所有VISA资源列表。若列表为空,说明后端未正确安装或仪器驱动缺失,需检查NI-VISA或pyvisa-py安装状态。
- 程序自动选择第一个资源进行连接。若该资源确实是可寻址仪器,输出将包含
仪器识别成功字样,后跟仪器返回的厂商、型号、序列号、固件版本(逗号分隔的四段字符串)。 - 若连接失败,程序会打印具体错误原因(如地址不可达、超时、权限不足)。
- 判定通过标准:成功打印出以
仪器识别成功开头且包含四段信息的完整IDN字符串,且该字符串与仪器铭牌或厂商文档中的标识一致。
关键说明
- 若系统安装了NI-VISA,
pyvisa.ResourceManager()默认使用NI后端;若未安装,则需确保pyvisa-py已安装,代码会自动回退到纯Python后端。 - 实际使用时,可将
target = available[0]改为具体的仪器地址字符串,例如target = "TCPIP0::192.168.1.100::INSTR"。 - 本案例仅实现仪器识别这一最小闭环。若需发送其他SCPI命令(如测量、配置),只需将
query("*IDN?")替换为对应的命令字符串即可,但超出本案例目标范围。