1113 lines
25 KiB
Plaintext
1113 lines
25 KiB
Plaintext
![]() |
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
INTRODUCING LXM
|
|||
|
|
|||
|
|
|||
|
BRIEF HISTORY OF XMODEM
|
|||
|
|
|||
|
|
|||
|
During the glory days of CP/M, the computer industry was
|
|||
|
plagued with a plethora of diskette formats. Since there was
|
|||
|
no single standard around, particularly when the 5" format
|
|||
|
was introduced, data interchange between computers was
|
|||
|
difficult.
|
|||
|
|
|||
|
|
|||
|
Several manufacturers attempted to provide a solution by
|
|||
|
giving their users the ability to at least read multiple
|
|||
|
diskette formats. Rather than promoting a standard format,
|
|||
|
this approach encouraged manufacturers to adopt proprietary
|
|||
|
formats as a marketing tool. Partially as a response to this
|
|||
|
situation, and partially out of a need to provide data
|
|||
|
transmission capabilities, Ward Christiansen developed the
|
|||
|
original specification for the XModem file transfer
|
|||
|
protocol.
|
|||
|
|
|||
|
|
|||
|
The XModem protocol, elegant in its simplicity and
|
|||
|
effectiveness, has transcended the decline of CP/M-based
|
|||
|
systems, and the ascendency of MS-DOS to become a de facto
|
|||
|
standard for data transfer between remote computers. This
|
|||
|
fact is true, even in the light of the near-universal
|
|||
|
acceptance of another de facto standard for diskette
|
|||
|
formats, as popularized by the IBM-PC family. With the
|
|||
|
advent of the new PS/2 with its incompatible micro-
|
|||
|
diskettes, the XModem protocol's place, at least for the
|
|||
|
foreseeable future, seems assured.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
PROTOCOL FUNDAMENTALS
|
|||
|
|
|||
|
|
|||
|
THE TRANSMISSION BLOCK
|
|||
|
|
|||
|
|
|||
|
The fundamental building block of XModem is an 8-bit byte,
|
|||
|
no parity please, arranged into transmission blocks of
|
|||
|
exactly 132 characters, never more nor less. In one
|
|||
|
extension to XModem, commonly called CRC-XModem, the
|
|||
|
transmission blocks are exactly 133 characters. We will
|
|||
|
discuss this extension , and a second known as YModem,
|
|||
|
later.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
LXM(tm) - LITECOMM (tm) XMODEM ENGINE for Microsoft
|
|||
|
Datalight and Turbo C
|
|||
|
|
|||
|
As you might guess, not only is the length of a transmission
|
|||
|
block fixed, but so too is the format. The XModem block
|
|||
|
format looks like this:
|
|||
|
|
|||
|
|
|||
|
<SOH> <REC> <~REC> <...128 Data Bytes...> <checksum>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
where:
|
|||
|
|
|||
|
SOH - 0x01 Signals the start of a block
|
|||
|
REC - Is the sequential block number reduced modulo 256
|
|||
|
~REC - The ones-compliment of REC
|
|||
|
checksum - an 8-bit sum of the preceding 128 data
|
|||
|
bytes, formed by adding each byte to an
|
|||
|
accumulator, then dropping all but the low order 8
|
|||
|
bits of the result.
|
|||
|
|
|||
|
|
|||
|
The intent of the additional characters is to facilitate
|
|||
|
error checking and recovery, making the XModem protocol an
|
|||
|
"error-free" means of data transfers under otherwise hostile
|
|||
|
conditions.
|
|||
|
|
|||
|
|
|||
|
The block number and its compliment are included to insure
|
|||
|
that no blocks are accidentally lost during transmission,
|
|||
|
and to prevent the accidental duplication of a data block
|
|||
|
which might be caused by spurious line noise. The checksum
|
|||
|
seeks to insure the validity of the actual data which might
|
|||
|
become garbled by line noise. The fixed length block format
|
|||
|
tends to simplify the logic required to implement the
|
|||
|
protocol in the first place.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
THE INTER-COMPUTER DIALOG
|
|||
|
|
|||
|
|
|||
|
Xmodem is essentially uni-directional in nature. That is,
|
|||
|
the actual flow of meaningful information occurs in one
|
|||
|
direction at a time, from the sending computer to the
|
|||
|
receiving computer. This is not meant to imply, however,
|
|||
|
that only one computer sends and the computer receives. To
|
|||
|
the contrary, there is a constant "dialog" going on between
|
|||
|
the two computers during the course of the transmission. It
|
|||
|
is this dialog that permits XModem to be true, "error-free"
|
|||
|
transfer method.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
CopyRight (c) 1987, 1988 Information Technology, Ltd.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
LXM(tm) - LITECOMM (tm) XMODEM ENGINE for Microsoft
|
|||
|
Datalight and Turbo C
|
|||
|
|
|||
|
Xmodem is a receiver-driven protocol. The receiving computer
|
|||
|
initiates and almost exclusively controls the transmissions,
|
|||
|
through a series of pre-planned responses. A typical, though
|
|||
|
brief dialog might look like this:
|
|||
|
|
|||
|
|
|||
|
RECEIVER SENDER MEANING
|
|||
|
|
|||
|
<NAK> --------------> READY TO RECEIVE
|
|||
|
<------------- <BLOCK1> FIRST BLOCK SENT
|
|||
|
<ACK> --------------> BLOCK RECEIVED OK
|
|||
|
<------------- <BLOCK2> SECOND BLOCK
|
|||
|
<NAK> --------------> ERROR, RESEND
|
|||
|
<------------- <BLOCK2> SECOND BLOCK
|
|||
|
<ACK> --------------> BLOCK RECEIVED OK
|
|||
|
<------------- <EOT> END OF FILE
|
|||
|
<ACK> --------------> E-O-F UNDERSTOOD
|
|||
|
|
|||
|
|
|||
|
As you can see, it is through the responses to the sending
|
|||
|
computer that the receiver controls the link.
|
|||
|
|
|||
|
|
|||
|
Xmodem also makes provision for unusual circumstances by
|
|||
|
providing both time-out and cancellation mechanisms. The
|
|||
|
rules for time-outs, time periods which may elapse before a
|
|||
|
disruption in transmission occurs are as follows:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
1. Waiting for SOH - 10 seconds, Resend last
|
|||
|
acknowledgement on time-out.
|
|||
|
|
|||
|
|
|||
|
2. Waiting for other block characters - 1 second,
|
|||
|
replace expected character with some pre-defined
|
|||
|
value upon time-out.
|
|||
|
|
|||
|
|
|||
|
3. Waiting for a reply to a block - 10 seconds,
|
|||
|
Resend last block upon time-out.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
CopyRight (c) 1987, 1988 Information Technology, Ltd.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
LXM(tm) - LITECOMM (tm) XMODEM ENGINE for Microsoft
|
|||
|
Datalight and Turbo C
|
|||
|
|
|||
|
The original protocol description also makes it possible for
|
|||
|
either the sender or receiver to cancel the transmission.
|
|||
|
This is of particular value when too many transmission
|
|||
|
errors occur, or, in rare cases, when the physical
|
|||
|
connection is broken. The threshold beyond which either side
|
|||
|
may request cancellation, although specified as 10 attempts
|
|||
|
in the original description of the protocol, has become
|
|||
|
somewhat arbitrary over time. The cancellation code, <CAN>
|
|||
|
or 0x10, may be sent by either the sender or receiver in
|
|||
|
place of the <SOH> or normal acknowledgment character
|
|||
|
respectively.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
ENHANCEMENTS TO XMODEM
|
|||
|
|
|||
|
|
|||
|
Over the years, several significant enhancements have been
|
|||
|
made to the protocol as originally defined by Ward
|
|||
|
Christiansen. The intent of these enhancements have
|
|||
|
generally been to improve upon the error-handling capability
|
|||
|
of the protocol, and to make the protocol more amenable to
|
|||
|
some less time-efficient communications environments,
|
|||
|
particularly those presented by for-pay services such as
|
|||
|
CompuServe.
|
|||
|
|
|||
|
|
|||
|
To make the protocol more error-free, the checksum employed
|
|||
|
in the original design has been replaced by a 16 bit
|
|||
|
calculation, called a Cyclical Redundancy Check or CRC.
|
|||
|
Based upon a polynomial equation, the CRC method can be
|
|||
|
mathematically demonstrated to be sensitive to all but about
|
|||
|
.03 per cent of errors. This error detection rate, about
|
|||
|
99.97 percent accurate, is far superior to the approximately
|
|||
|
90 to 92 percent accuracy of the checksum approach. The
|
|||
|
overhead of an additional 8 bits per message seems to make
|
|||
|
this enhancement well worth while.
|
|||
|
|
|||
|
|
|||
|
The second enhancement seeks to improve communication over
|
|||
|
packet-switched networks, like those employed by CompuServe
|
|||
|
and other national services. Basically this enhancement
|
|||
|
introduces a relaxed time-out between characters in a block,
|
|||
|
allowing additional time before the protocol recognizes a
|
|||
|
time-out condition.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
CopyRight (c) 1987, 1988 Information Technology, Ltd.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
LXM(tm) - LITECOMM (tm) XMODEM ENGINE for Microsoft
|
|||
|
Datalight and Turbo C
|
|||
|
|
|||
|
A third enhancement, variant of the original XModem protocol
|
|||
|
seeks to improve overall efficiency by expanding the block
|
|||
|
size from 128 characters to 1024 characters. This variant,
|
|||
|
commonly call ymodem, reduces the number of times that an
|
|||
|
acknowledgment sequence must be sent, thereby increasing the
|
|||
|
efficiency of actual data transfer.
|
|||
|
|
|||
|
|
|||
|
The LXM XModem engine supports all of the enhancements
|
|||
|
mentioned above.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
THE LXM ENGINE
|
|||
|
|
|||
|
|
|||
|
OVERVIEW
|
|||
|
|
|||
|
|
|||
|
One of the reasons for the popularity of the XModem protocol
|
|||
|
over time is the simplicity of the implementation. Given a
|
|||
|
reasonable communications package upon which to build,
|
|||
|
developing a basic implementation of XModem is relatively
|
|||
|
simple, although under certain operating systems, such as
|
|||
|
the Unix family, the attempt of the OS to be all things to
|
|||
|
all people may actually become an impediment.
|
|||
|
|
|||
|
|
|||
|
The intent of the LXM engine is to 1) provide XModem
|
|||
|
capability, 2) in a flexible, easy to understand package, 3)
|
|||
|
built upon a sound foundation, the LiteComm communications
|
|||
|
ToolBox. Because of the manner in which the LXM engine was
|
|||
|
designed virtually any application can have access to
|
|||
|
XModem's error-free protocol, without being relegated to
|
|||
|
simply transferring files.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
MAJOR ENGINE COMPONENTS
|
|||
|
|
|||
|
|
|||
|
The LXM engine consists, primarily of two functions, lcxrrec
|
|||
|
and lcxtrec, receive a record and transmit a record
|
|||
|
respectively. Because these two functions 'understand' the
|
|||
|
XModem protocol internally, they assume full responsibility
|
|||
|
for all of the necessary housekeeping, relying upon the host
|
|||
|
program for only the most basic of functions.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
CopyRight (c) 1987, 1988 Information Technology, Ltd.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
LXM(tm) - LITECOMM (tm) XMODEM ENGINE for Microsoft
|
|||
|
Datalight and Turbo C
|
|||
|
|
|||
|
The lcxrrec function receives one or more records from a
|
|||
|
companion system. The host program controls the checking
|
|||
|
method, CRC or checksum, the time-out method, normal or
|
|||
|
relaxed, handles, in what ever way appropriate, blocks of
|
|||
|
data that have been received, and can optionally monitor the
|
|||
|
flow of data from the companion system. Lcxrrec assumes the
|
|||
|
responsibility for synchronizing with the companion system
|
|||
|
and for correctly maintaining the flow of information.
|
|||
|
|
|||
|
|
|||
|
Lcxtrec performs in a like fashion when the host program
|
|||
|
wants to send one or more records. The host program has only
|
|||
|
to present the record to be transmitted, and lcxtrec does
|
|||
|
the rest. The lcxtrec module assumes responsibility for
|
|||
|
establishing synchronization with the receiving computer,
|
|||
|
and for recognizing the checking method, CRC or checksum,
|
|||
|
that the receiver wants to use. Lcxtrec also terminates the
|
|||
|
transmission, when told to do so by the host program, and
|
|||
|
permits the host to optionally monitor the data flow.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
CopyRight (c) 1987, 1988 Information Technology, Ltd.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
LXM(tm) - LITECOMM (tm) XMODEM ENGINE for Microsoft
|
|||
|
Datalight and Turbo C
|
|||
|
|
|||
|
NOTES AND WARNINGS
|
|||
|
|
|||
|
|
|||
|
MODIFICATIONS
|
|||
|
|
|||
|
|
|||
|
The LXM engine is closely integrated with the LiteComm
|
|||
|
ToolBox. While there is every likelihood that the engine can
|
|||
|
be modified to function with other similar packages,
|
|||
|
Information Technology, Ltd., can only support the LXM
|
|||
|
engine when used with either the LiteComm ToolBox.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
PARITY AND DATA BITS
|
|||
|
|
|||
|
|
|||
|
The XModem protocol is an 8-bit protocol. That is to say it
|
|||
|
neither recognizes nor tolerates parity checking, i.e. 7
|
|||
|
data bits plus a specified parity. Since the LXM engine
|
|||
|
cannot determine the current settings for parity and number
|
|||
|
of data bits, the responsibility for controlling these
|
|||
|
settings rests with the host program. Before using either of
|
|||
|
the key functions lcxrrec or lcxtrec, the host program must
|
|||
|
insure that the settings are no parity, 8 data bits, using
|
|||
|
the comm_setup function. Upon final termination of the
|
|||
|
function, the host program must reset these values to their
|
|||
|
original settings, if necessary.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
INTERNAL TIMER FUNCTION
|
|||
|
|
|||
|
|
|||
|
Both lcxrrec and lcxtrec employ a hardware-based timing
|
|||
|
function that connects directly to the normal real-time
|
|||
|
clock vector 0x1C; The Microsoft and Turbo C version of this
|
|||
|
function also establishes an special routine, using the
|
|||
|
atexit() function, to insure that this vector is re-
|
|||
|
established at is original setting when program termination
|
|||
|
occurs. This is not true of the Datalight version however.
|
|||
|
The Datalight library does not, at present, have an like
|
|||
|
atexit().
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
CopyRight (c) 1987, 1988 Information Technology, Ltd.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
LXM(tm) - LITECOMM (tm) XMODEM ENGINE for Microsoft
|
|||
|
Datalight and Turbo C
|
|||
|
|
|||
|
While every effort has been made, for Datalight users, to
|
|||
|
insure that the vector is properly reset, this plan may be
|
|||
|
thwarted by abnormal termination of the host program
|
|||
|
resulting in a subsequent system crash. The safest method to
|
|||
|
Datalight user's to employ would be to use the lc_clrclock()
|
|||
|
function before host program termination. As an alternate
|
|||
|
approach, Datalight users may want to investigate STEVE'S
|
|||
|
LIBRARY designed for Datalight C users's. This excellent
|
|||
|
library does have an equivalent function to the atexit().
|
|||
|
|
|||
|
|
|||
|
|
|||
|
BUFFER SIZE RESTRICTION
|
|||
|
|
|||
|
|
|||
|
The LiteComm ToolBox permits you a great deal of freedom in
|
|||
|
tailoring the communications handler to meet your specific
|
|||
|
requirements. We must caution you, however, that when you
|
|||
|
are using the LXM engine, the minimum buffer sizes required
|
|||
|
by the comm_opn function are not adequate to support LXM,
|
|||
|
particularly when transmitting records at either low baud
|
|||
|
rates, or on the new generation of high-speed (above 6 MHz)
|
|||
|
processors.
|
|||
|
|
|||
|
|
|||
|
During the development of LXM, it was quickly discovered
|
|||
|
that too small a transmit buffer quickly resulted in a
|
|||
|
buffer overflow condition. We recommend that, when using the
|
|||
|
LXM engine, the transmit buffer be set at a minimum 256
|
|||
|
bytes to avoid the overflow condition. If you intended to
|
|||
|
employ the YModem variant, then the minimum buffer sizes
|
|||
|
should be set to at least 1030.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
XON-XOFF CONTROL
|
|||
|
|
|||
|
|
|||
|
If your host program employs the XON-XOFF functions in
|
|||
|
LiteComm, you must be sure that the automatic XON-XOFF
|
|||
|
handing is disabled before you attempt to transmit or
|
|||
|
receive records using LXM. Failure to observe this caution
|
|||
|
may result in a system hang, requiring that the system be
|
|||
|
re-booted.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
USER-ACCESSIBLE DATA
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
CopyRight (c) 1987, 1988 Information Technology, Ltd.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
LXM(tm) - LITECOMM (tm) XMODEM ENGINE for Microsoft
|
|||
|
Datalight and Turbo C
|
|||
|
|
|||
|
Within LXM, certain variables have been defined as being
|
|||
|
globally available. The host program may examine the
|
|||
|
contents of these variables at any time to determine the
|
|||
|
current state of the LXM engine. The correct definitions of
|
|||
|
these variable is contained in litexm.h. Except as noted
|
|||
|
below, the host program must NOT alter the contents of these
|
|||
|
variables.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
abort_flag - This is the only variable of the group
|
|||
|
that may be altered by the host program. The
|
|||
|
flag is checked periodically by the engine
|
|||
|
functions. If _abort_flag has a value of 1, the
|
|||
|
function in progress will be cancelled
|
|||
|
automatically by sending a CAN instruction to
|
|||
|
the companion system. See the TTL.C sample
|
|||
|
program for an example of how this flag may be
|
|||
|
set.
|
|||
|
|
|||
|
|
|||
|
crc - If this variable has a non-zero value, then
|
|||
|
the LXM engine is currently using the CRC error-
|
|||
|
checking method. A zero value indicates that the
|
|||
|
original checksum method is being used.
|
|||
|
|
|||
|
|
|||
|
checksum and crcaccum - These variables hold the
|
|||
|
current/last calculated check value. In a
|
|||
|
practical sense, they are of no value to the
|
|||
|
host program.
|
|||
|
|
|||
|
|
|||
|
rec - This variable contains the current record
|
|||
|
(block) number being processed. In the event of
|
|||
|
an uncorrectable error, rec would contain the
|
|||
|
number of the expected block. In the case of a
|
|||
|
successful transmission or reception, rec-1 is
|
|||
|
the number of the block sent or received. The
|
|||
|
value contained in this variable, reduced modulo
|
|||
|
256, provides the block number required by the
|
|||
|
XModem protocol and must NEVER be disturbed.
|
|||
|
|
|||
|
|
|||
|
ymodem - This variable is set to TRUE if the
|
|||
|
host application wants to transmit a block in
|
|||
|
YModem mode (1024 characters). See the
|
|||
|
discussion of lcxtrec, below.
|
|||
|
|
|||
|
|
|||
|
PROGRAMMERS REFERENCE
|
|||
|
|
|||
|
|
|||
|
|
|||
|
CopyRight (c) 1987, 1988 Information Technology, Ltd.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
LXM(tm) - LITECOMM (tm) XMODEM ENGINE for Microsoft
|
|||
|
Datalight and Turbo C
|
|||
|
|
|||
|
ENGINE-RELATED FUNCTIONS
|
|||
|
|
|||
|
|
|||
|
The following pages document the LXM engine functions as
|
|||
|
currently implemented. They follow, in style and content,
|
|||
|
the documentation for the LiteComm ToolBox itself.
|
|||
|
|
|||
|
|
|||
|
Use the following pages as an addendum to your LiteComm
|
|||
|
documentation.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
CopyRight (c) 1987, 1988 Information Technology, Ltd.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
LXM(tm) - LITECOMM (tm) XMODEM ENGINE for Microsoft
|
|||
|
Datalight and Turbo C
|
|||
|
|
|||
|
lcxrrec
|
|||
|
_______________________________________________________________
|
|||
|
|
|||
|
|
|||
|
SUMMARY
|
|||
|
|
|||
|
#include <litexm.h>
|
|||
|
#include <litecomm.h>
|
|||
|
|
|||
|
int lcxrrec(port,buff,rbsize,hmode,hdshk)
|
|||
|
unsigned port;
|
|||
|
unsigned char *buff;
|
|||
|
int *rbsize;
|
|||
|
int hmode;
|
|||
|
unsigned char *hdshk;
|
|||
|
|
|||
|
|
|||
|
DESCRIPTION
|
|||
|
|
|||
|
Receive a block of either 128 or 1024 bytes from the
|
|||
|
companion system, using the checking method specified in
|
|||
|
hdshk, and the time-out value specified in hmode. If
|
|||
|
necessary, establish synchronization with the companion
|
|||
|
system.
|
|||
|
|
|||
|
|
|||
|
The port parameter is the same as used throughout the
|
|||
|
LiteComm ToolBox.
|
|||
|
|
|||
|
|
|||
|
Buff should be a pointer to an array of 128 bytes in when
|
|||
|
using XModem mode, 1024 bytes for YModem mode. All record
|
|||
|
characters are received into this area, and, if the area is
|
|||
|
too small, LXM will overwrite adjacent data without warning.
|
|||
|
|
|||
|
|
|||
|
Rbsize is a POINTER to an integer variable. Lcxrrec returns
|
|||
|
the actual length of the received block to this variable.
|
|||
|
This approach is needed since, using YModem, blocks may be
|
|||
|
either 1024 bytes or 128 bytes at the discretion of the
|
|||
|
SENDER. Lcxrrec automatically detects the block length and
|
|||
|
returns it to the caller so that the caller can process the
|
|||
|
block correctly.
|
|||
|
|
|||
|
|
|||
|
The value of hmode determines whether normal or relaxed
|
|||
|
time-out values are used. Please use the constants provided
|
|||
|
in the litexm header file to insure a proper setting.
|
|||
|
|
|||
|
The value contained initially in hdshk must be either CRC or
|
|||
|
NAK, defined in litexm.h. The former specifies the use of
|
|||
|
|
|||
|
|
|||
|
CopyRight (c) 1987, 1988 Information Technology, Ltd.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
LXM(tm) - LITECOMM (tm) XMODEM ENGINE for Microsoft
|
|||
|
Datalight and Turbo C
|
|||
|
|
|||
|
the 16 bit CRC checking mode, while the latter specifies the
|
|||
|
use of the original checksum method. Note - If you intend
|
|||
|
to operate in YModem mode, hdshk must specify CRC.
|
|||
|
|
|||
|
Note that hdshk is a pointer to a character. Lcxrrec uses
|
|||
|
this area to store its reply to the last received block.
|
|||
|
Once you have set this value, and have started to receive,
|
|||
|
DO NOT alter its value under any circumstances. Doing so may
|
|||
|
cause unpredictable results.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
EXAMPLE
|
|||
|
|
|||
|
See the accompanying program TTL for an example of lcxrrec
|
|||
|
usage.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
RETURN VALUES
|
|||
|
|
|||
|
Lcxrrec may return several values, as defined in the
|
|||
|
litexm.h file. Each return value should cause the host
|
|||
|
program to respond in specific ways.
|
|||
|
|
|||
|
|
|||
|
SUCCESS - A record has been successfully received into the
|
|||
|
buff area. Host program process the record and calls lcxrrec
|
|||
|
again.
|
|||
|
|
|||
|
|
|||
|
RETRIES - The maximum number of attempts to receive a single
|
|||
|
record has been exceeded. Lcxrrec automatically cancels the
|
|||
|
session. Host program should handle in an appropriate
|
|||
|
manner, e.g. issue error message.
|
|||
|
|
|||
|
|
|||
|
ERR (-1) - Lcxrrec has detected that the host program has
|
|||
|
requested cancellation of transmissions through the
|
|||
|
_abort_flag setting (see below) or a fatal record sequence
|
|||
|
has occurred, e.g. a block number has been skipped. Lcxrrec
|
|||
|
automatically cancels the session.
|
|||
|
|
|||
|
|
|||
|
CAN - The sending program has requested cancellation. Host
|
|||
|
program should handle in a fashion similar to RETRIES.
|
|||
|
|
|||
|
|
|||
|
EOT - The sending program has no more data to transmit.
|
|||
|
Lcxrrec acknowledges the EOT message automatically. Host
|
|||
|
program handles like an end-of-file condition.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
CopyRight (c) 1987, 1988 Information Technology, Ltd.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
LXM(tm) - LITECOMM (tm) XMODEM ENGINE for Microsoft
|
|||
|
Datalight and Turbo C
|
|||
|
|
|||
|
TOUT - Lcxrrec failed to establish synchronization with the
|
|||
|
sending program while waiting to receive the SOH (or STX for
|
|||
|
YModem) character at the start of the block. The session is
|
|||
|
automatically cancelled.
|
|||
|
|
|||
|
|
|||
|
DUPSEQ - The block just received is a duplicate of the
|
|||
|
preceding block. The host program should ignore the data
|
|||
|
contained within the block, the call lcxrrec to proceed with
|
|||
|
data transfer.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
CopyRight (c) 1987, 1988 Information Technology, Ltd.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
LXM(tm) - LITECOMM (tm) XMODEM ENGINE for Microsoft
|
|||
|
Datalight and Turbo C
|
|||
|
|
|||
|
lcxtrec
|
|||
|
_______________________________________________________________
|
|||
|
|
|||
|
|
|||
|
SUMMARY
|
|||
|
|
|||
|
#include <litexm.h>
|
|||
|
#include <litecomm.h>
|
|||
|
|
|||
|
int lcxtrec(port, buff)
|
|||
|
unsigned port;
|
|||
|
unsigned char *buff;
|
|||
|
|
|||
|
|
|||
|
DESCRIPTION
|
|||
|
|
|||
|
Transmit a block of 128 or 1024 bytes to the companion
|
|||
|
system. The checking protocol, CRC or checksum, is detected
|
|||
|
automatically when the receiving station issues its initial
|
|||
|
handshaking sequence. If necessary, establish
|
|||
|
synchronization with the companion system before
|
|||
|
transmitting.
|
|||
|
|
|||
|
|
|||
|
The port parameter is the same as used throughout the
|
|||
|
LiteComm ToolBox.
|
|||
|
|
|||
|
|
|||
|
Buff should be a pointer to a 128 or 1024 byte record to be
|
|||
|
sent to the companion system. This is not a typical, null-
|
|||
|
terminated string as usually found in C. All bytes, starting
|
|||
|
at the pointer will be transmitted. It is the responsibility
|
|||
|
of the host program to provide any padding that might be
|
|||
|
required to satisfy the length requirement. Generally,
|
|||
|
short records are padded with NULLS or ^Z (0x1A).
|
|||
|
|
|||
|
|
|||
|
Lcxtrec determines the block size to be transmitted based
|
|||
|
upon the current value of the global variable ymodem (see
|
|||
|
the introduction). If ymodem has a value of TRUE, then buff
|
|||
|
is assumed to point to a 1024 byte record. If ymodem is
|
|||
|
FALSE, then a 128 byte record is assumed. This feature has
|
|||
|
particular value when operating in YModem mode.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
CopyRight (c) 1987, 1988 Information Technology, Ltd.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
LXM(tm) - LITECOMM (tm) XMODEM ENGINE for Microsoft
|
|||
|
Datalight and Turbo C
|
|||
|
|
|||
|
When using YModem protocol, block sizes may be either 128 or
|
|||
|
1024 bytes, at the senders discretion. This serves two
|
|||
|
purposes. In the case of a large number of errors, many
|
|||
|
YModem implementations will automatically switch to the
|
|||
|
smaller block size if too many errors occur using the larger
|
|||
|
block size, in an effort to get the data through, then
|
|||
|
revert back to the normal block of 1024 characters. Lcxtrec
|
|||
|
implements this feature automatically.
|
|||
|
|
|||
|
|
|||
|
Generally, at the end of a file, the final block to be sent
|
|||
|
will not exactly match the transmission block size. Under
|
|||
|
XModem, this means that as many as 127 wasted characters
|
|||
|
might be transmitted. Under YModem, as many as 1023 wasted
|
|||
|
characters can be transmitted in the final block. However,
|
|||
|
the host program that calls lcxtrec can determine if the
|
|||
|
block to be sent is less than 1024 bytes, set the ymodem
|
|||
|
variable to FALSE, and send multiple 128 byte blocks. Using
|
|||
|
this approach, the amount of wasted characters will be no
|
|||
|
worse than the original XModem. The TTL sample program,
|
|||
|
included in the package, shows one way of approaching this
|
|||
|
problem.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
EXAMPLE
|
|||
|
|
|||
|
See the accompanying program TTL for an example of lcxtrec
|
|||
|
usage.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
RETURN VALUES
|
|||
|
|
|||
|
Lcxtrec may return several values, as defined in the
|
|||
|
litexm.h file. Each return value should cause the host
|
|||
|
program to respond in specific ways.
|
|||
|
|
|||
|
|
|||
|
SUCCESS - The record has been successfully sent from the
|
|||
|
buff area. Host program either calls lcxtrec with the next
|
|||
|
record to transmit, or lcxteot to indicate End of
|
|||
|
Transmission to the companion system.
|
|||
|
|
|||
|
|
|||
|
RETRIES - The maximum number of attempts to send a single
|
|||
|
record has been exceeded. Lcxtrec automatically cancels the
|
|||
|
session. Host program should handle in an appropriate
|
|||
|
manner, e.g. issue an error message.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
CopyRight (c) 1987, 1988 Information Technology, Ltd.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
LXM(tm) - LITECOMM (tm) XMODEM ENGINE for Microsoft
|
|||
|
Datalight and Turbo C
|
|||
|
|
|||
|
ERR (-1) - Lcxtrec has detected that the host program has
|
|||
|
requested cancellation of transmissions through the
|
|||
|
_abort_flag setting (see below).
|
|||
|
|
|||
|
|
|||
|
CAN - The receiving program has requested cancellation.
|
|||
|
Host program should handle in a fashion similar to RETRIES.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
CopyRight (c) 1987, 1988 Information Technology, Ltd.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
LXM(tm) - LITECOMM (tm) XMODEM ENGINE for Microsoft
|
|||
|
Datalight and Turbo C
|
|||
|
|
|||
|
lcxteot
|
|||
|
_______________________________________________________________
|
|||
|
|
|||
|
|
|||
|
SUMMARY
|
|||
|
|
|||
|
#include <litexm.h>
|
|||
|
#include <litecomm.h>
|
|||
|
|
|||
|
int lcxtrec(port)
|
|||
|
unsigned port;
|
|||
|
|
|||
|
|
|||
|
DESCRIPTION
|
|||
|
|
|||
|
Send and End of Transmission (End of File) to the receiving
|
|||
|
system. This function must be called to successfully close
|
|||
|
out the transmission session.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
EXAMPLE
|
|||
|
|
|||
|
See the accompanying program TTL for an example of lcxtrec
|
|||
|
usage.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
RETURN VALUES
|
|||
|
|
|||
|
Lcxteot returns one of two values, as defined in the
|
|||
|
litexm.h file.
|
|||
|
|
|||
|
SUCCESS - The receiving station has correctly acknowledged
|
|||
|
the EOT. The host program terminates transmission mode
|
|||
|
normally.
|
|||
|
|
|||
|
CAN - Either the receiving system has responded to the EOT
|
|||
|
message with a CAN code, or has failed to respond correctly
|
|||
|
and the lcxteot function has sent the CAN code to the
|
|||
|
receiving system. Host program should handle in an
|
|||
|
appropriate manner, e.g. issue an appropriate error message.
|
|||
|
|
|||
|
|
|||
|
Regardless of the value returned, invoking lcxteot always
|
|||
|
terminates the current transmission session.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
CopyRight (c) 1987, 1988 Information Technology, Ltd.
|
|||
|
|