Beispiel #1
0
/* 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;
	}
Beispiel #2
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:
 *   #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;
}
Beispiel #4
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);
	}
Beispiel #5
0
ssize_t vxi11_receive(VXI11_CLINK * clink, char *buffer, size_t len)
{
	return vxi11_receive_timeout(clink, buffer, len, VXI11_READ_TIMEOUT);
}