第4章:GPIB/USB通信基础
各位同学,今天我们来聊聊仪器通信里最基础、也最绕不开的两个东西——GPIB和USB。说实话,我刚入行那会儿,光配GPIB地址就折腾了一下午。后来才发现,很多坑其实是可以提前避开的。
4.1 GPIB地址配置:别小看这个旋钮
GPIB,全称是通用接口总线。老一点的仪器基本都带这个口。它最大的特点就是——可以并联。你想想看,一台电脑通过一根GPIB线,最多能连15台仪器。每台仪器必须有一个唯一的地址,范围是0到30。
地址怎么设? 大部分仪器后面板有个小旋钮,或者按键菜单。我习惯把地址设成跟仪器类型相关。比如万用表设16,电源设17,这样好记。
还有一种情况——有些老仪器地址设好后要重启才生效。嗯,这个也容易忘。
4.2 USB识别:即插即用?不一定
现在的仪器很多都支持USB接口。插上电脑,理论上应该自动识别。但现实往往没那么美好。
我遇到过最典型的问题:插上USB线,设备管理器里显示“未知设备”。为什么?
- 驱动没装。很多仪器需要安装VISA驱动或者厂商专用驱动。
- USB线质量差。别笑,我吃过这个亏。换根线就好了。
- 供电不足。有些便携仪器靠USB供电,电脑USB口电流不够就识别不了。
识别成功后,你会在设备管理器里看到一个“USB Test and Measurement Device”之类的设备。这时候,它就有了一个VISA资源名称,比如 USB0::0x1234::0x5678::INSTR。这个字符串后面会用到。
4.3 PyVISA库的基本使用
PyVISA是Python里操作仪器最常用的库。说白了,它就是帮我们跟仪器“说话”的翻译官。
安装很简单:
pip install pyvisa pyvisa-py
然后我们来看看怎么用。先列出所有可用的仪器:
import pyvisa
rm = pyvisa.ResourceManager()
print(rm.list_resources())
你会看到类似这样的输出:
('USB0::0x1234::0x5678::INSTR', 'GPIB0::16::INSTR')
有了资源名,就可以连接仪器了:
inst = rm.open_resource('GPIB0::16::INSTR')
print(inst.query('*IDN?')) # 查询仪器身份
*IDN? 是SCPI标准命令,几乎所有仪器都支持。它会返回仪器的制造商、型号、序列号等信息。我每次拿到新仪器,第一件事就是发这个命令,确认通信正常。
*CLS(清除状态)、*RST(复位)这些通用命令。
4.4 与模拟仪器通信:先练练手
没有真实仪器怎么办?别急,PyVISA支持模拟仪器。我们可以用 pyvisa-sim 这个库来模拟。
安装:
pip install pyvisa-sim
然后写一个简单的模拟仪器配置文件(比如 sim.yaml):
resources:
- name: GPIB0::16::INSTR
type: GPIB
address: 16
commands:
- command: "*IDN?"
response: "模拟万用表,SN12345"
- command: "MEAS:VOLT:DC?"
response: "5.123"
启动模拟器:
pyvisa-sim sim.yaml
然后你的Python代码就可以像操作真实仪器一样操作它了:
import pyvisa
rm = pyvisa.ResourceManager('@sim')
inst = rm.open_resource('GPIB0::16::INSTR')
print(inst.query('*IDN?')) # 输出:模拟万用表,SN12345
print(inst.query('MEAS:VOLT:DC?')) # 输出:5.123
这个模拟器特别适合调试代码。我经常在开发阶段先用模拟器跑通逻辑,再连真实仪器。省去了反复插拔线缆的麻烦。
4.5 避坑指南
最后,分享几个我踩过的坑:
- 超时问题: 仪器没响应时,PyVISA默认会等很久。建议设置超时:
inst.timeout = 5000(5秒)。 - 编码问题: 有些老仪器返回的数据带换行符,记得用
.strip()清理。 - 资源释放: 用完仪器记得
inst.close(),否则下次可能连不上。
好了,这一章的内容就到这里。下一章我们会真正开始采集数据,到时候这些基础就派上用场了。