/* This is mainly a useful function for the overloaded vxi11_obtain_value() * fn's, but is also handy and useful for user and library use */ long vxi11_send_and_receive(CLINK *clink, const char *cmd, char *buf, unsigned long buf_len, unsigned long timeout) { int ret; long bytes_returned; do { ret = vxi11_send(clink, cmd); if (ret != 0) { if (ret != -VXI11_NULL_WRITE_RESP) { printf("Error: vxi11_send_and_receive: could not send cmd.\n"); printf(" The function vxi11_send returned %d. ",ret); return -1; } else printf("(Info: VXI11_NULL_WRITE_RESP in vxi11_send_and_receive, resending query)\n"); } bytes_returned = vxi11_receive_timeout(clink, buf, buf_len, timeout); if (bytes_returned <= 0) { if (bytes_returned >-VXI11_NULL_READ_RESP) { printf("Error: vxi11_send_and_receive: problem reading reply.\n"); printf(" The function vxi11_receive returned %ld. ",bytes_returned); return -2; } else printf("(Info: VXI11_NULL_READ_RESP in vxi11_send_and_receive, resending query)\n"); } } while (bytes_returned == -VXI11_NULL_READ_RESP || ret == -VXI11_NULL_WRITE_RESP); return bytes_returned; }
/* This function reads a response in the form of a definite-length block, such * as when you ask for waveform data. The data is returned in the following * format: * #800001000<1000 bytes of data> * ||\______/ * || | * || \---- number of bytes of data * |\--------- number of digits that follow (in this case 8, with leading 0's) * \---------- always starts with # */ ssize_t vxi11_receive_data_block(VXI11_CLINK * clink, char *buffer, size_t len, unsigned long timeout) { /* I'm not sure what the maximum length of this header is, I'll assume it's * 11 (#9 + 9 digits) */ size_t necessary_buffer_size; char *in_buffer; int ret; int ndigits; size_t returned_bytes; int l; char scan_cmd[20]; necessary_buffer_size = len + 12; in_buffer = (char *)malloc(necessary_buffer_size); if (!in_buffer) { return -1; } ret = vxi11_receive_timeout(clink, in_buffer, necessary_buffer_size, timeout); if (ret < 0) { return ret; } if (in_buffer[0] != '#') { printf("vxi11_user: data block error: data block does not begin with '#'\n"); printf("First 20 characters received were: '"); for (l = 0; l < 20; l++) { printf("%c", in_buffer[l]); } printf("'\n"); return -3; } /* first find out how many digits */ sscanf(in_buffer, "#%1d", &ndigits); /* some instruments, if there is a problem acquiring the data, return only "#0" */ if (ndigits > 0) { /* now that we know, we can convert the next <ndigits> bytes into an unsigned long */ sprintf(scan_cmd, "#%%1d%%%dlu", ndigits); sscanf(in_buffer, scan_cmd, &ndigits, &returned_bytes); memcpy(buffer, in_buffer + (ndigits + 2), returned_bytes); free(in_buffer); return (ssize_t )returned_bytes; } else { return 0; } }
/* This function reads a response in the form of a definite-length block, such * as when you ask for waveform data. The data is returned in the following * format: * DATA_ARRAY_1,#9000001000<1000 bytes of data> * \___________/||\_______/ * | || | * | || \---- number of bytes of data * | |\--------- number of digits that follow (in this case 9, with leading 0's) * | \---------- always starts with # * \----------------- whatever array you ask for, if you ask for "DAT1" you get "DAT1,#9...." */ long lecroy_receive_data_block(VXI11_CLINK * clink, char *buffer, size_t len, unsigned long timeout) { /* I'm not sure what the maximum length of this header is, I'll assume it's * 24 (DATA_ARRAY_1,#9 + 9 digits) */ size_t necessary_buffer_size; char *in_buffer; int ret; int ndigits; size_t returned_bytes; int l = 0; char scan_cmd[20]; necessary_buffer_size = len + 25; in_buffer = new char[necessary_buffer_size]; ret = vxi11_receive_timeout(clink, in_buffer, necessary_buffer_size, timeout); if (ret < 0) return ret; while ((in_buffer[l] != '#') && (l < 25)) l++; if (in_buffer[l] != '#') { printf ("lecroy_user: data block error: data block does not begin with '#'\n"); printf("First 25 characters received were: '"); for (l = 0; l < 25; l++) { printf("%c", in_buffer[l]); } printf("'\n"); return -3; } /* first find out how many digits */ sscanf(in_buffer + l, "#%1d", &ndigits); /* some instruments, if there is a problem acquiring the data, return only "#0" */ if (ndigits > 0) { /* now that we know, we can convert the next <ndigits> bytes into an unsigned long */ sprintf(scan_cmd, "#%%1d%%%dlu", ndigits); sscanf(in_buffer + l, scan_cmd, &ndigits, &returned_bytes); memcpy(buffer, in_buffer + (ndigits + l + 2), returned_bytes); delete[]in_buffer; return (long)returned_bytes; } else return 0; }
/* Lazy wrapper for when I can't be bothered to specify a read timeout */ long vxi11_receive(CLINK *clink, char *buffer, unsigned long len) { return vxi11_receive_timeout(clink, buffer, len, VXI11_READ_TIMEOUT); }
ssize_t vxi11_receive(VXI11_CLINK * clink, char *buffer, size_t len) { return vxi11_receive_timeout(clink, buffer, len, VXI11_READ_TIMEOUT); }