#include "visamanager.h"
#include <QDebug>
VisaManager::VisaManager(const QString &add, QObject *parent)
: m_add(add)
, QObject(parent)
{
}
VisaManager::~VisaManager()
{
close();
delete m_lib;
m_lib = nullptr;
}
void VisaManager::setAddr(const QString &add)
{
m_add = add;
}
bool VisaManager::openDevice()
{
// QString libPath = "C:\\Windows\\System32\\visa32.dll";
QString libPath = "C:\\Program Files (x86)\\IVI Foundation\\VISA\\WinNT\\Bin\\visa64.dll";
m_lib = new QLibrary(this);
m_lib->setFileName(libPath);
if (!m_lib->load()) {
qDebug() << Q_FUNC_INFO << "lib load failed! path:" << libPath;
return false;
}
qDebug() << Q_FUNC_INFO << "lib load success!";
initFunc();
m_viStatus = f_viOpenRm(&m_viSessionRm);
if (m_viStatus != VI_SUCCESS) {
getVisaError();
return false;
}
ViRsrc addr = new char[m_add.length() + 1];
strcpy(addr, m_add.toStdString().c_str());
m_viStatus = f_viOpen(m_viSessionRm, addr, VI_NULL, VI_NULL, &m_viHandle);
if (m_viStatus != VI_SUCCESS) {
getVisaError();
return false;
}
m_viStatus = f_viSetAtt(m_viHandle, VI_ATTR_TMO_VALUE, 2000); //超时时间
if (m_viStatus != VI_SUCCESS) {
getVisaError();
return false;
}
m_viStatus = f_viSetAtt(m_viHandle, VI_ATTR_SUPPRESS_END_EN, VI_FALSE); //不接收/n
if (m_viStatus != VI_SUCCESS) {
getVisaError();
return false;
}
m_viStatus = f_viSetAtt(m_viHandle, VI_ATTR_SEND_END_EN, VI_FALSE); //不发送/n
if (m_viStatus != VI_SUCCESS) {
getVisaError();
return false;
}
qDebug() << Q_FUNC_INFO << "Open Ddevice Success Add:" << m_add;
return true;
}
void VisaManager::initFunc()
{
f_viOpenRm = (FviOpenDefaultRM)m_lib->resolve("viOpenDefaultRM");
f_viOpen = (FviOpen)m_lib->resolve("viOpen");
f_viSetAtt = (FviSetAttribute)m_lib->resolve("viSetAttribute");
f_viWrite = (FviWrite)m_lib->resolve("viWrite");
f_viRead = (FviRead)m_lib->resolve("viRead");
f_viClose = (Fviclose)m_lib->resolve("viClose");
}
bool VisaManager::write(const QString &data)
{
ViByte wr_buff[MAX_SEND_LEN];
char send_buff[MAX_SEND_LEN];
memset(wr_buff, 0, sizeof(wr_buff));
memset(send_buff, 0, sizeof(send_buff));
strcpy(send_buff, data.toStdString().c_str());
m_viStatus = f_viWrite(m_viHandle, (ViConstBuf)send_buff, (ViUInt32)strlen(send_buff), VI_NULL);
if (m_viStatus != VI_SUCCESS) {
getVisaError();
return false;
}
qDebug() << Q_FUNC_INFO << "send success data:" << send_buff;
return true;
}
bool VisaManager::read(QString &data)
{
ViPUInt32 re_count;
ViByte rd_buff[MAX_SEND_LEN];
memset(rd_buff, 0, sizeof(rd_buff));
m_viStatus = f_viRead(m_viHandle, (ViBuf)rd_buff, MAX_SEND_LEN, re_count);
if (m_viStatus != VI_SUCCESS) {
getVisaError();
return false;
}
data = QString::fromLocal8Bit((char *)rd_buff);
qDebug() << Q_FUNC_INFO << "read:" << data;
return true;
}
void VisaManager::close()
{
f_viClose(m_viHandle);
f_viClose(m_viSessionRm);
}
QString VisaManager::getVisaError()
{
QString err;
switch (m_viStatus) {
case VI_ERROR_ALLOC:
err = "系统资源不足。";
break;
case VI_ERROR_INV_SETUP:
err = "配置文件无效或者不存在。";
break;
case VI_ERROR_SYSTEM_ERROR:
err = "VISA系统初始化失败。";
break;
case VI_SUCCESS_DEV_NPRESENT:
err = "连接成功。但是指定的地址无响应。";
break;
case VI_WARN_CONFIG_NLOADED:
err = "指定的地址不存在或者地址格式不正确。";
break;
case VI_ERROR_INTF_NUM_NCONFIG:
err = "指定的地址是有效的,但无法使用。";
break;
case VI_ERROR_INV_ACC_MODE:
err = "非法的存取模式。";
break;
case VI_ERROR_INV_RSRC_NAME:
err = "地址名称语法错误。";
break;
case VI_ERROR_INV_SESSION:
err = " ";
break;
// case VI_ERROR_INV_OBJECT:
// err = "无效的vi。";
// break;
case VI_ERROR_LIBRARY_NFOUND:
err = "VISA库加载不完全。";
break;
case VI_ERROR_NSUP_OPER:
err = "资源管理器sesn不支持此函数。";
break;
case VI_ERROR_RSRC_BUSY:
err = "sesn是有效的,但当前无法访问。";
break;
case VI_ERROR_RSRC_LOCKED:
err = "sesn被独占。";
break;
case VI_ERROR_RSRC_NFOUND:
err = "信息不足或者资源不存在。";
break;
case VI_ERROR_TMO:
err = "操作超时.";
break;
case VI_WARN_NSUP_ATTR_STATE:
err = "设置的属性是有效的,但不支持此属性启用。(这请求将停止,但可能会有性能改变。)";
break;
case VI_ERROR_ATTR_READONLY:
err = "只读属性。";
break;
// case VI_ERROR_INV_SESSION:
// err = "";
break;
case VI_ERROR_NSUP_ATTR:
err = "该资源中没有指定的属性。";
break;
case VI_ERROR_NSUP_ATTR_STATE:
err = "传的值不是有效值,或者该属性不支持该定义的值。(该操作将被阻止并返回错误。) ";
break;
// case VI_ERROR_RSRC_LOCKED:
// err = "vi被上锁。";
default:
break;
}
qDebug() << Q_FUNC_INFO << "status:" << m_viStatus << err.toStdWString().data();
return err;
}
评论0