Я проверяю ваниль 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
Нет, нет разницы. Это все еще не обнаруживает плохую команду.
Это стандартная виза? Должно ли это работать так? Означает ли это, что если я хочу обнаружить эти ошибки, мне всегда нужно включить событие VI_EVENT_SERVICE_REQ
и так viWaitOnEvent()
после записи? Я бы подумал, что ваниль viWrite()
обнаружит это для меня ??
viWrite
просто заботится о написании (см. Справочник программистов Ni Visa), что означает, что он возвращает ошибку только в случае истинного сбоя связи (например, тайм-аут или кто-то отключил кабель и т. д.). Это стандартно для низкоуровневых функций ввода / вывода (сокеты, последовательные порты, … все работает таким образом).
Это означает, что для того, чтобы выяснить, есть ли ошибка удаленного устройства, вам нужно как-то запросить это. Я не знаком с VISA, поэтому я не уверен, что лучше всего добиться этого. Это либо что-то в стиле, о котором вы говорите (события), или, может быть, вы можете запросить устройство напрямую? (может быть, вы можете написать команду, которая скажет «дайте мне ваш статус», а затем прочитать ответ?)
Других решений пока нет …