NI VISA и viWrite не обнаруживают ошибки команд

Я проверяю ваниль 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() обнаружит это для меня ??

0

Решение

viWrite просто заботится о написании (см. Справочник программистов Ni Visa), что означает, что он возвращает ошибку только в случае истинного сбоя связи (например, тайм-аут или кто-то отключил кабель и т. д.). Это стандартно для низкоуровневых функций ввода / вывода (сокеты, последовательные порты, … все работает таким образом).

Это означает, что для того, чтобы выяснить, есть ли ошибка удаленного устройства, вам нужно как-то запросить это. Я не знаком с VISA, поэтому я не уверен, что лучше всего добиться этого. Это либо что-то в стиле, о котором вы говорите (события), или, может быть, вы можете запросить устройство напрямую? (может быть, вы можете написать команду, которая скажет «дайте мне ваш статус», а затем прочитать ответ?)

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]