斯坦福SR650双通道滤波器
本文档主要介绍如何使用c++对SR650进行控制
一、GBIP连接线
本项目中使用的GBIP转usb连接线型号为82357B USB/GPIB 接口高速 USB 2.0
连接使用
GBIP连接线插上SR650设备并且与电脑进行连接后发现其警示灯常亮,查看说明书后发现可能需要安装对于的IO以及设备驱动
相关软件如下图所示,地址
软件截图:
二、配置环境
1. 安装软件
下载安装程序库套件IO程序库套件地址
跳转后进入到下载页面
点击下载后即可
打开安装包,根据提示信息进行安装
2. 例程
如果没有visa库,可以查看example程序所使用的库地址
3. 引入配置内容
1. 引入头文件目录
2. 引入库目录
3. 引入lib文件
注意事项
本项目所使用的连接线为是德科技的82357B USB/GPIB线,因此使用NIMAX好像连不上设备,需要使用是德科技的程序进行连接
三、程序
1. 注意事项
1. 连接设备问题
调试过程中发现使用viOpen根据端口地址打开设备并不会判断该设备是否合法只会判断当前端口能否打开,因此在打开端口后需要对设备发送命令,根据返回值判断是否连接成功。
2. 写入命令问题
调试时发现使用CString发送命令会导致写入数据无法达到预期效果,无法成功操作设备,因为CString以\0结尾,而程序需要监听到\n为结束符(感觉有点不对)。因此在unicode环境下采用CStringA读取与写入数据。
3. 读取问题
调试过程中发现读取设备信息时总是会读取前一条操作后产生的信息,需要读取多次后才能正常返回信息,此问题使用setAttribute设置缓冲区刷新模式以及在读取前手动刷新缓冲区都无法正常读取,如果需要使用读取则需要读取两次取最后一次数据
2. 初始化程序
需要在使用的窗口类中声明一个SR650Object对象并在类创建时调用其初始化函数
BOOL CSR650Object::SR_Initialize() {
m_IChannel = 1; // 初始化通道为高通
m_viDefRM = VI_NULL; // 初始化visa资源会话句柄为空
m_viDevice = VI_NULL; // 初始化设备句柄为空
return TRUE;
}
3. 连接设备
打开Keysight Connection Expert软件,将下图所示设备地址填入程序中
关于GPIB设备地址有以下说明,需要对滤波器后面的sw1口进行修改查看是否会影响其设备地址,如果设备地址可以通过设置滤波器sw1口进行控制则可以将地址写死
关于电脑分配的GPIB0::10::INSTR VISA地址是否会改变的问题,我们需要从几个方面来考虑:
1. GPIB地址的基本性质
GPIB(General Purpose Interface Bus)是一种广泛应用于仪器和计算机制造行业的接口标准,它允许计算机与各种仪器进行通信。
在GPIB系统中,每个设备都被分配一个唯一的地址,用于在通信过程中识别和定位设备。
GPIB地址通常是在硬件上设定的,并且一旦设定,除非进行人为修改,否则不会自行改变。
2. VISA地址的构成
VISA(Virtual Instrument Software Architecture)是一个用于配置、编程和故障排除的I/O函数库,它提供了与各种仪器通信的统一接口。
VISA地址(如GPIB0::10::INSTR)通常由几部分组成,包括接口类型(GPIB)、接口编号(0)、设备地址(10)以及设备类型(INSTR)。
当前程序已经封装好了地址查询功能,可以自动连接对应端口,下面是地址查询方法以及连接方法的使用
/*
查找设备地址数组
@Param searchString 查找字符串通配符
@Return 返回一个地址数组
*/
vector<string> CSR650Object::SR_Find_Device_Address(ViString searchString)
{
vector<string> vecAddress;
ViSession resourceManager;
ViSession findListSession;
ViUInt32 foundCount;
ViChar address[100];
viOpenDefaultRM(&resourceManager);
//printf("Find with search string \"%s\":\n", searchString);
viFindRsrc(resourceManager, searchString, &findListSession, &foundCount, address);
if (foundCount > 0)
{
while (foundCount-- > 0)
{
vecAddress.push_back(address);
TRACE("\t%s\n", address);
if (foundCount <= 0)
{
viClose(findListSession);
}
else
{
viFindNext(findListSession, address);
}
}
}
else
{
TRACE("... didn't find anything!\n");
}
viClose(resourceManager);
return vecAddress;
}
/*
连接滤波器
@Param visaAddress 设备地址,可以从Keysight Connection Expert软件查找到
*/
BOOL CSR650Object::SR_Connect(CString visaAddress)
{
// 当设备存在时跳过,防止多次连接
if (m_viDevice > 0)
return TRUE;
vector<string> vecAddress = SR_Find_Device_Address("GPIB0?*INSTR");
if (m_viDefRM <= VI_NULL)
{
// 获取visa资源会话句柄
m_viState = viOpenDefaultRM(&m_viDefRM);
if (m_viState != VI_SUCCESS)
{
return FALSE;
}
for (int i = 0; i < vecAddress.size(); i++)
{
// 打开设备
string strAddress = vecAddress[i];
m_viState = viOpen(m_viDefRM, (ViString)strAddress.c_str(), VI_NULL, 1, &m_viDevice);
m_viState = viSetAttribute(m_viDevice, VI_ATTR_TMO_VALUE, 200);
if (m_viState != VI_SUCCESS)
{
// 连接失败将所有参数复原
//m_viState = viClose(m_viDefRM); // 关闭会话
//m_viDefRM = VI_NULL;
continue;
}
CString version;
//
m_viState = SR_Get_Identifier(version);
if (version != "Stanford Research Systems,SR650,S/N8644,v 1.09\n")
{
continue;
}
// 设置波特率,数据位等信息
viSetAttribute(m_viDevice, VI_ATTR_ASRL_BAUD, 9600);
viSetAttribute(m_viDevice, VI_ATTR_ASRL_DATA_BITS, 8);
viSetAttribute(m_viDevice, VI_ATTR_ASRL_PARITY, VI_ASRL_PAR_NONE);
viSetAttribute(m_viDevice, VI_ATTR_ASRL_FLOW_CNTRL, VI_ASRL_FLOW_DTR_DSR);
//viSetAttribute(m_viDevice, VI_ATTR_RD_BUF_OPER_MODE, VI