1、硬件准备
1.1、数字万用表
型号 :Agilent 34401A
前面图示:
后面图示:有GPIB接口
1.2、GPIB-USB-HS转接线
2、GPIB协议基础了解
2.1、引脚
8条数据线:DIO1 ~ DIO8
5条管理线:IFC、ATN、REN、EOI、SRQ
3条交握线:DAV、NRFD、NDAC
感兴趣的话,可以研究这些线是如何控制传输的,Qt程序有封装好的接口,直接用就行。
2.2、特性
- (1)、GPIB数据传输,并行以BIN(1个BIN为8个bytes)传输数据、串行以byte传输数据,双向异步传输,即发送一条命令,再接收一条命令,不能同时收发。
- (2)、命令和数据用ASCII表示,可转成ASCLL对应的十六进制。
- (3)、用双引号(“”)括起来的字符是ASCII字符。
例如某个机器使用的命令“B CR LF” , 表示ASCII中的值(B,CR,LF),转成十六进制为(0x42,0x0D,0x0A)。 - (4)、有些机器,"CR LF"表示协议结束符,收发的数据都有,方便解析。
注意:每一种机器使用的命令字段各不相同,需要查看数据手册,但原理是一样的。
2.3、数据解析
例如发送结果和测试数据给某个机器:
“C”命令,
"PF"为的低4位为4个通道的测试结果,0表示PASS,1表示FAIL,当前仅测试1个通道,
byte1 ~ byte8的低4位为测试的32位数据,如下图。
2.4、数字万用表使用的SCPI协议
用于控制可编程测试测量仪器的标准语法和命令,例如:
1、*IDN?
2、MEAS:VOLT:DC? 10, 0.003
第1条命令得到数字万用表的型号信息
第2条命令量取DC电压
更多的需要查看Agilent 34401A手册
3、软件安装
3.1、安装NI VISA
点 NI官网下载安装包ni-visa_xx.0_online.exe,全部下一步即可,安装好后重启电脑。
可能不会生成桌面快捷方式,去开始菜单可以找到图标
安装此软件,可得到QT编程需要的外部库,还能初步测试命令的有效性
3.2、安装QT
我使用的版本
4、NI VISA软件操控数字万用表
4.1、设置数字万用表
GPIB-USB-HS转接线连到电脑,接上数字万用表,通电后打开Power On开关。
如果数字万用表为GPIB模式,设备地址ADDR 22会一闪而过。
我的数字万用表默认为 RS-232模式,可通过下图的顺序改成GPIB模式。
用到下图红框中的几个按键,按上图1至5的步骤,设置GPIB模式。
4.2、NI MAX软件控制
打开NI MAX软件,扫描到了GPIB-USB-HS设备,和数字万用表
点“与仪器通信”,写入“*IDN?”命令,点查询,得到数字万用表信息
写入“MEAS:VOLT:DC? 10, 0.003”命令,点查询,得到DC电压0.02
5、QT编程控制数字万用表
5.1、新建QT工程
新建项目
下一步选择64-bit的调试配置
找到NI VISA安装位置的库文件
放入工程
修改工程配置,加入外部库,打开gpib_test.pro文件夹,末尾加入代码
这样就可以使用vi接口、或ni488接口编程了,2种接口按需求自己选。
5.2、vi接口介绍
引用vi接口需要的头文件
#include "visatype.h"
#include "visa.h"
常用函数如下:
函数 | 功能 |
---|---|
viOpenDefault | 打开VISA资源管理器 |
viFindRsrc | 查找VISA设备获得ID |
viOpen | 打开VISA设备 |
viClose | 关闭VISA设备 |
viWrite | 发送命令或数据 |
viRead | 接收数据 |
viReadSTB | 读设备状态 |
5.3、ni488接口介绍
引用ni488接口需要的头文件
#include "ni488.h"
#include "ni4882.h"
常用函数如下:
函数 | 功能 |
---|---|
ibdev | 获取设备符 |
ibwrt | 发送命令或数据 |
ibrd | 接收数据 |
ibwait | 延时 |
ibrsp | 读设备状态 |
5.4、应用代码
我使用的是vi接口
#include <QDebug>
#include "visatype.h"
#include "visa.h"
ViSession defaultRM; //VISA资源管理器描述符
ViSession vi; //GPIB设备描述符
char instrDescriptor[VI_FIND_BUFLEN]; //GPIB设备ID名
ViUInt32 numInstrs; //GPIB设备个数
ViFindList findList;
int MainWindow::gpib_test()
{
if(viOpenDefaultRM(&defaultRM) != VI_SUCCESS) {
qDebug() << "打开VISA资源管理器失败.";
return -1;
}
qDebug() << "打开VISA资源管理器成功.";
if(viFindRsrc (defaultRM, "GPIB?*INSTR", &findList, &numInstrs, instrDescriptor) < VI_SUCCESS)
{
qDebug() << "无可用VISA资源,请检查设备连接";
viClose (defaultRM);
return -1;
}
else
{
qDebug() << "可用VISA资源数量:" << numInstrs;
qDebug() << "GPIB设备描述符:" << instrDescriptor;
}
if(viOpen(defaultRM, instrDescriptor, VI_NULL, VI_NULL, &vi) != VI_SUCCESS) {
viClose(defaultRM);
return -1;
}
qDebug() << "GPIB设备成功连接设备";
//向数字万用表发送读信息命令
char command[256] = "*IDN?";
char response[256] = "";
qDebug() << "发送读信息命令:" << command;
if(VI_SUCCESS == viWrite(vi, (ViBuf)command, strlen(command), NULL)) {
if(VI_SUCCESS == viRead(vi, (ViBuf)response, sizeof(response), NULL)) {
qDebug() << "接收数据:" << response;
}
}
//向数字万用表发送读信息命令
char command1[256] = "MEAS:VOLT:DC? 10, 0.003";
char response1[256] = "";
qDebug() << "发送读DC电压命令:" << command1;
if(VI_SUCCESS == viWrite(vi, (ViBuf)command1, strlen(command1), NULL)) {
if(VI_SUCCESS == viRead(vi, (ViBuf)response1, sizeof(response1), NULL)) {
qDebug() << "接收数据:" << response1;
}
}
// 关闭GPIB设备
viClose(vi);
viClose(defaultRM);
}
5.5、带界面示例
上述应用代码上加入界面设计,可得到下图的结果
5.6、NI I/O Trace软件的使用
可打开NI I/O Trace软件抓协议,会把发送和接收的数据罗列出来,如图:
右击每条协议,可以查看函数说明,还能解析数据的十六进制值,例如第8条