我正在测试vanilla viWrite()
函数,并且已经意识到当我传入无效的命令字符串时,不会返回错误代码。我发现这有点奇怪......当然,实施应该检测到这个事件。
这是一个我用来演示这个的小测试案例......(它只是测试代码所以它不会是完美的:))
#include <visa.h>
#include <cstring>
#include <iostream>
#define VIBUF_LEN 255
static ViChar viBuf[VIBUF_LEN];
void MyWrite(ViSession sess, char const *cmd)
{
ViStatus status;
ViUInt32 rcount;
strncpy_s(viBuf, cmd, VIBUF_LEN);
status = viWrite(sess, (ViBuf)viBuf, strlen(viBuf), &rcount);
if (status < VI_SUCCESS)
{
std::cout << "Failed to write!\n";
exit(-1);
}
}
std::string MyRead(ViSession sess)
{
ViStatus status;
ViUInt32 rcount;
status = viRead(sess, (ViBuf)viBuf, VIBUF_LEN, &rcount);
if (status < VI_SUCCESS)
{
std::cout << "Failed to read 1!\n";
exit(-1);
}
else if (rcount >= VIBUF_LEN)
{
std::cout << "Failed to read 2!\n";
exit(-1);
}
else if (!rcount)
{
std::cout << "Failed to read 3!\n";
exit(-1);
}
viBuf[rcount] = NULL;
return std::string(viBuf);
}
int _tmain(int argc, _TCHAR* argv[])
{
ViStatus status;
ViSession mVisaDefaultRM;
ViSession mVisaInst;
status = viOpenDefaultRM(&mVisaDefaultRM);
if (status == VI_SUCCESS)
{
strncpy_s(viBuf, "GPIB0::1::INSTR", VIBUF_LEN);
status = viOpen(mVisaDefaultRM, viBuf, VI_NULL, VI_NULL, &mVisaInst);
}
if (status < VI_SUCCESS)
{
std::cout << "Failed to initialise!\n";
exit(-1);
}
viClear(mVisaInst);
MyWrite(mVisaInst, "*CLS;");
MyWrite(mVisaInst, "*RST;");
MyWrite(mVisaInst, "*SRE 0;");
MyWrite(mVisaInst, "*ESE 0;");
MyWrite(mVisaInst, "CRAP;"); /* Wow really!? */
MyWrite(mVisaInst, "*ESR?;");
std::string str = MyRead(mVisaInst);
std::cout << "ESR is " << str.c_str() << "\n";
std::cout << "END\n";
getchar();
return 0;
}
该程序输出以下内容:
ESR is +32
END
所以,编写SCPI命令“CRAP;”肯定被设备标记为错误。
这让我想到啊......我没有启用ESE位来使该位在STB中被标记。所以我这样做:
MyWrite(mVisaInst, "*ESE 255;");
// ^^^
// A bit of a sledge hammer but should do the job
仍未检测到错误命令。
好吧,也许需要启用SRQ ...也许VISA库需要这两个启用来处理这个......
所以我这样做:
MyWrite(mVisaInst, "*SRE 255;");
// ^^^
// A bit of a sledge hammer but should do the job
不,没有区别。它仍然没有检测到错误的命令。
这是标准的VISA吗?它应该像这样工作吗?这是否意味着如果我想检测这些错误,我总是必须启用事件VI_EVENT_SERVICE_REQ
,然后在写入后启用viWaitOnEvent()
?我原以为香草viWrite()
会为我发现这个?
答案 0 :(得分:2)
viWrite
只是负责编写(参见Ni Visa Programmers Reference),这意味着只有在真正的通信失败时才会返回错误(如超时或拔掉电缆的人等)。这是低级I / O功能的标准配置(插座,串口,...都是这样工作的。)
这意味着为了弄清楚是否存在远程设备错误,您必须以某种方式进行查询。我不熟悉VISA,所以我不确定最好的方法也是如此。它可以是您谈论的风格(事件),也可以直接查询设备? (也许你可以用viWrite命令说“给我你的状态”,然后vi读回应?)