如何用 PyVISA 让 Python 自动操控 GPIB / USB / TCP/IP 测量仪器
【免费下载链接】pyvisaA Python package with bindings to the "Virtual Instrument Software Architecture" VISA library, in order to control measurement devices and test equipment via GPIB, RS232, or USB.项目地址: https://gitcode.com/gh_mirrors/py/pyvisa
桌上摆着一台示波器、一台电源,你希望它们自己吐数据,而不是手动抄读数。VISA(虚拟仪器软件架构)是仪器通信的行业标准,GPIB、串口、USB、网口这些接口各有各的脾气。PyVISA 把 VISA 标准封装成一套 Python API:装好之后,一段代码就能同时驾驭不同接口、不同厂商的仪器,不需要硬件厂商驱动也能跑起来。
🔌 PyVISA 安装步骤:一条 pip 命令 + 选对后端
pip install pyvisaPyVISA 本身只是一层壳,真正干活的是后端——底层驱动的实现包。选哪个,看你的机器现在有什么:
| 后端 | 什么时候选它 | 安装方式 |
|---|---|---|
ivi(NI-VISA) | 系统装了 VISA 驱动套件,功能最全、最稳 | 无需额外安装,装好驱动即默认启用 |
py(pyvisa-py) | 没有任何驱动,想要跨平台的纯 Python 实现 | pip install pyvisa-py |
serial(PySerial) | 只玩 RS232 串口,要一个轻量方案 | pip install pyserial |
拿不准就先装pyvisa-py,后面可以无感切换。
📡 3 行代码列出全部设备,跑通第一次 *IDN? 查询
打开仪器前,先确认机器能看到它。*IDN?是 SCPI 里的身份命令,应答里带着厂商、型号、序列号,是验证连接最省事的一招:
import visa rm = visa.ResourceManager() # 创建资源管理器,自动挑默认后端 for name in rm.list_resources(): # 枚举全部可见仪器 box = rm.open_resource(name) # 打开其中一台 print(box.query("*IDN?")) # 身份查询 box.close()列表为空别急着怀疑代码,先查线缆和驱动,后面有一节专门排这个错。
⚡ 读测量值、下指令:PyVISA 最常用的 3 个方法
读数值。思路:query()一次完成"发命令 + 等应答";返回的字符串想直接变数字,就用query_ascii_values一步转成数值列表,省掉手动 split:
meter.timeout = 2000 # 读数慢的设备,把等待从默认 5 秒放宽 sample = meter.query_ascii_values("MEAS:VOLT:DC?") # "3.291,3.294" -> [3.291, 3.294]下指令。write()是单向发送,不需要应答;参数格式务必照手册抄,单位符号一个都别少:
gen.write("FREQ 10e6") # 让信号源输出 10 MHz⏳ PyVISA 异步读取:长任务别把进程卡死
耗时几十秒的批量读数,同步调用会把整个程序挂起。思路:用read_asynchronously()把读取放到后台 job,主循环隔一会儿查一次缓冲区,非空即可取数:
meter.query("MEAS:VOLT:DC?") # 先发起测量 buf = meter.read_asynchronously() # 后台开始读,立即返回 while buf is None: # 轮询 job 状态 buf = meter.read_asynchronously() values = buf[:] # 拿到字节后转成数值需要事件驱动而不是轮询时,再看wait_on_event(),那是进阶话题。
生态怎么搭:PyVISA 只管搬数据
PyVISA 只负责把字节搬进 Python,剩下各环节交给分工明确的库:
- numpy:把读数变成数组,做均值、方差等数学运算
- scipy:滤波、插值等信号处理
- pandas:把多轮采集整理成表,落盘或出报表
- matplotlib:画波形、出报告
- pyserial:pyvisa-py / serial 后端处理串口的底层依赖
一条线串起来:采集 → 入库 → 画图。
新手常见卡点:资源、超时、后端 3 问
| 现象 | 原因 | 处理 |
|---|---|---|
list_resources()返回空 | 没插上、地址没对、驱动没装 | 查线缆与 GPIB 地址;核对资源名写法,如GPIB0::5::INSTR、ASRL1::INSTR、TCPIP::192.168.1.10::inst0::INSTR |
读数据报VisaIOError超时 | 默认等待只有 5 秒 | 调大instrument.timeout;del instrument.timeout设为无限等待(谨慎使用) |
| 创建 ResourceManager 就报错,提示找不到后端 | 既没装 NI-VISA 也没装 pyvisa-py | pip install pyvisa-py,不动任何硬件驱动 |
还有一件顺手的事:python -m visa能进交互式命令行,直接list、open、query,比跑脚本更快定位问题。
下一步:官方文档与社区
- 深入属性、事件、二进制块读取:docs/source/api/index.rst
- 安装与资源命名等常见问题:docs/source/faq/faq.rst
- 想看 ResourceManager 和 Resource 的实现:pyvisa/highlevel.py
仓库地址:https://gitcode.com/gh_mirrors/py/pyvisa,需要完整源码时 clone 下来即可。
【免费下载链接】pyvisaA Python package with bindings to the "Virtual Instrument Software Architecture" VISA library, in order to control measurement devices and test equipment via GPIB, RS232, or USB.项目地址: https://gitcode.com/gh_mirrors/py/pyvisa
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考