I can talk to a serial device using Visa, either doing direct read/write, or setting up a handler to trigger on a \n TERMCHAR.
I can also talk to a similar device that uses USB using direct read/writes.
But all my attempts at getting a callback on a TERMCHAR have failed. Am I missing something obvious or is it that devious ?
I have also tried viWrite/ReadAsync and it does trigger on the write, but not on the read.
Simplified code here:
#define USE_CALLBACK // (or not)
viOpenDefaultRM (&defaultRM);
viOpen (defaultRM, instrDescriptor, VI_NULL, VI_NULL, &instr);
viGetAttribute (instr, VI_ATTR_INTF_TYPE, &Attr);
if (Attr==VI_INTF_ASRL) {
viSetAttribute (instr, VI_ATTR_TERMCHAR, '\n');
viSetAttribute (instr, VI_ATTR_TERMCHAR_EN, VI_TRUE);
viSetAttribute (instr, VI_ATTR_ASRL_END_IN, VI_ASRL_END_TERMCHAR);
viSetAttribute (instr, VI_ATTR_ASRL_END_OUT, VI_ASRL_END_TERMCHAR);
#ifdef USE_CALLBACK
viInstallHandler(instr, VI_EVENT_ASRL_TERMCHAR, cbs_Reply, NULL);
viEnableEvent (instr, VI_EVENT_ASRL_TERMCHAR, VI_HNDLR, VI_NULL);
#endif
} else if (Attr==VI_INTF_USB) {\
viSetAttribute(instr, VI_ATTR_TERMCHAR_EN, 0);/* Without callback: both 0 and 1 work */
viSetAttribute(instr, VI_ATTR_TERMCHAR, '\n');
viSetAttribute(instr, VI_ATTR_SEND_END_EN, 1);
#ifdef USE_CALLBACK
viInstallHandler(instr, VI_EVENT_IO_COMPLETION, cbs_Reply, NULL));
viEnableEvent (instr, VI_EVENT_IO_COMPLETION, VI_HNDLR, VI_NULL);
viInstallHandler(instr, VI_EVENT_SERVICE_REQ, cbs_Reply, NULL);
viEnableEvent (instr, VI_EVENT_SERVICE_REQ, VI_HNDLR, VI_NULL);
// Also tried other event types
#endif
}
ViStatus _VI_FUNCH cbs_Reply(ViSession vi, ViEventType eventType, ViEvent event, ViAddr userHandle) {
char Reply[256], Str[256];
int Nb=0;
sprintf(Str, "EventType:0x%X, Event:0x%X, Handle:0x%p\n", eventType, event, userHandle);
viRead(vi, (unsigned char*)Reply, 255, &Nb);
Reply[Nb]='\0'; // Otherwise the string is not terminated
return 0;
}
// Sending
char Send[]="*IDN?";
viWrite(instr, (unsigned char*)Send, strlen(Send), &BufSize);
#ifndef USE_CALLBACK
Delay(0.1);
cbs_Reply(instr, 0, 0, NULL); // Direct call to read the buffer
#endif