Measurement Computing Personal488 rev.3.0 For DOS & Windows 3.Xi User Manual
Page 95

8H. Turbo C
II. SOFTWARE GUIDES - 8. Driver488/DRV
II-80
Personal488 User’s Manual, Rev. 3.0
int cklpint(void)
int _false_(void)
int (*ieee_cki)(void) = _false_
void no_op(void)
void (*ieee_isr)(void) = no_op
Driver488/DRV signals interrupts, which are enabled with the
ARM
command, by causing the light
pen signal to appear “true.” The
CKLPINT
checks that Driver488/DRV is able to service an
interrupt (the response from
IOCTL_RD
is
0
) and then checks if an interrupt is pending by
checking the light pen status. The
IEEEWT
routine (described below) calls the function pointed to
by
IEEE_CKI
to determine if an
IEEE
interrupt needs to be serviced. The
IEEE_CKI
normally
points to the function
_false_
which always returns zero (
0
). To enable interrupt checking
IEEE_CKI
must be redirected to point to
CKLPINT
. Interrupt checking is disabled by pointing
IEEE_CKI
back to
_false_
. Once an interrupt has been detected,
IEEEWT
calls the interrupt
service routine pointed to by
IEEE_ISR
to service the interrupt. The
IEEE_ISR
initially points to
no_op
, a function that does nothing, but it may be redirected as needed to specify the appropriate
interrupt service routine for each part of a program.
•
_IEEEWT
and
_IEEERD
are very similar to the unbuffered _
WRITE
and _
READ
routines provided
in the C library.
int _ieeewt(int handle,char chars[])
int _ieeerd(int handle,char chars[],int size)
#define ieeewt(chars) _ieeewt(ieee,chars)
#define ieeerd(chars) _ieeerd(ieee,chars,sizeof(chars))
The
_IEEEWT
differs from _
WRITE
in that it checks for Driver488/DRV interrupts before writing,
determines the number of characters to write by using
STRLEN
, and prints an error message if an
error has occurred during writing. The
_IEEERD
differs from _
READ
only in that it prints an error
message if an error has occurred during reading.
IEEEWT
and
IEEERD
(without the leading
underscore) write and read to the file
IEEE
. Notice that
IEEERD
uses
SIZEOF
to determine the
number of characters to read. This only works if
SIZEOF
can determine the number of bytes in the
receive buffer,
chars
. This means
chars
must be an array of known size, for example,
char chars[256]
, not
char*chars
.
•
IEEEPRTF
and
IEEESCNF
are IEEE 488 versions of
PRINTF
and
SCANF
, respectively.
int ieeeprtf(char *format, ...)
int ieeescnf(char *format, ...)
The
IEEEPRTF
accepts a format string and a list of arguments. It formats its arguments according
to the specified format and sends the formatted string to Driver488/DRV. The
IEEESCNF
accepts
a format string and pointers (to the types specified in the format string). It reads a string of up to
256 bytes from Driver488/DRV, terminates it with a zero, converts it according to the format
string, and places the converted values into the variables pointed to by the specified pointers.
•
RAWMODE
sets the file specified by
handle
for “raw mode” I/O.
int rawmode(int handle);
In “raw mode” MS-DOS does not interpret the characters received from the file. In particular,
control-Z
is not taken as end-of-file. “Raw mode” is usually appropriate for IEEE 488
communications because it does not interfere with the transfer of binary data and because it is
much more efficient than “non-raw mode” I/O.
•
IEEEINIT
establishes communications with Driver488/DRV and configures it for use with C.
int ieeeinit(void);
It first opens the file
IEEE
for both reading and writing and puts the file descriptor into
IEEE
. It
then puts the file into “raw mode”. Driver488/DRV is then initialized by sending the
IOCTL
“BREAK”
and
RESET
commands. Normal output from C is terminated by a new-line (line feed)
character, and returned strings should be terminated by a null, so
EOL OUT LF
and
EOL IN $0
commands are then issued. Finally a
FILL ERROR
command is issued to enable
SEQUENCE - NO
DATA AVAILABLE
error detection. If an error is detected during any of these commands,
IEEEINIT
returns a
-1
, otherwise it returns a zero (
0
).