home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: Programmierung / SOURCE.mdf / programm / msdos / basic / qbser320 / qbserial.doc < prev    next >
Encoding:
Text File  |  1993-09-07  |  45.7 KB  |  953 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.                                  QBserial version 3.20
  7.  
  8.             Serial I/O Routines for QB 4.x, BC 7.x, VBDOS, & FOSSIL Drivers
  9.  
  10.           This library will provide you with serial I/O communications
  11.           routines for use in QuickBASIC 4.x (with or without PDQ), the
  12.           Microsoft Basic Compiler 7.x Professional Development System, and
  13.           Visual Basic for DOS 1.x. No longer are you forced to use the poor
  14.           communications support provided by QB.  This program will allow you
  15.           to control 8250 and 16450 type communications ports (UARTS) at
  16.           speeds of up to 115200 baud. Communication ports 1 - 4, and non-
  17.           standard addresses are supported. You will no longer have problems
  18.           with the DTR signal. DTR is left in the same state it was in when
  19.           before you called this driver, or it can be controlled by your
  20.           program. The serial driver includes XON/XOFF and CTS/RTS
  21.           handshaking. Serial input is interrupt driven, using any IRQ you
  22.           specify (1 - 15), with incoming XOFF flow control (if enabled), or
  23.           RTS flow control (if enabled) to prevent overrunning the input
  24.           buffer. This is referred to as "Normal" mode. 
  25.  
  26.           This driver also has a mode where it will operate with FOSSIL
  27.           drivers (INT 14h interface). Using FOSSIL mode allows you to use
  28.           virtually any type of communications hardware, since the type of
  29.           hardware accessed is dependant on the FOSSIL driver. This mode
  30.           requires that you have a FOSSIL driver loaded in advance. This is
  31.           referred to as "FOSSIL" mode.
  32.  
  33.           The driver was written with Microsoft's C, and compiled with
  34.           version 6.0a of that compiler. This driver is useable with
  35.           QuickBASIC version 4.x, and Basic Compiler 6.x & 7.x PDS  (With or
  36.           without PDQ), and Visual Basic for DOS version 1.x. Basic Compiler
  37.           1.x, QuickBASIC 2.x, and 3.x are not supported by this driver. The
  38.           reason is that versions of QuickBASIC prior to 4.0 do not support
  39.           the extensive multi-language interface that QB4.x has (via the
  40.           DECLARE statement and Microsoft language extensions). Throughout
  41.           this manual QB will be used to refer to both QuickBASIC, the Basic
  42.           Compilers (6.x & 7.x PDS), and Visual Basic for DOS.
  43.  
  44.           Before the driver can be used, the following INCLUDE statement must
  45.           be added to the beginning of your QB program:
  46.  
  47.           '    $INCLUDE: 'qbserial.dec'
  48.  
  49.           The declarations included by this statement specify all the entry
  50.           points into the serial driver. DO NOT change them or the driver
  51.           will not function.
  52.  
  53.           Refer to the included sample programs SIMPLE.BAS, PCBDOOR.BAS, and
  54.           OFFHOOK.BAS. they use most of the calls described below.
  55.  
  56.  
  57.  
  58.         QBSERIAL User Manual - V 3.20                              Page 1
  59.  
  60.  
  61.  
  62.  
  63.           Qbserial has two (2) modes of operation: Normal and FOSSIL. The
  64.           mode you operate in is specified in the OpenComm statement (The
  65.           FOS% parameter). In the following sections, where applicable, each
  66.           parameter will be explained as to how it operates in both Normal
  67.           and FOSSIL mode.
  68.  
  69.                                   Port Initialization
  70.  
  71.           OpenComm Port%, IRQ/Stat%, Wlen%, Parity%, Bits%, Baud&, HS%, FOS%
  72.  
  73.           Parameter:     Port%
  74.  
  75.           Normal:   If the specified port is 1 to 4, the driver opens that
  76.                     port. If you specify the port as ZERO (0) the driver
  77.                     enters "LOCAL" mode. This allows you to call the driver
  78.                     with data, but the driver won't send anything. This is
  79.                     useful when working with "doors". if you specify the port
  80.                     as any other value, QBserial will use that as the base
  81.                     address for the port. This allows you to work with non-
  82.                     standard I/O addresses. Note however that if you open a
  83.                     non-standard port, you must specify an IRQ value from 1
  84.                     to 15 - There is no default IRQ when used in this manner.
  85.  
  86.           FOSSIL:   Unlike normal mode, "port" does not necessarily relate to
  87.                     a specific communications port or address. Using a "1"
  88.                     for a port value does NOT necessarily mean COM1. Also
  89.                     unlike QBserial's normal mode, a value other than 1 - 4
  90.                     does NOT refer to a base address of a UART.
  91.  
  92.                     When using FOSSIL mode, "port" refers to a logical
  93.                     device. Port 0 is the first port of a FOSSIL device
  94.                     driver, Port 1 the second, and so on. When used with
  95.                     drivers such as X00.SYS (assuming you didn't remap the
  96.                     ports), port 0 refers to COM1, and port 1 refers to COM2.
  97.                     This will vary depending on the FOSSIL driver used and
  98.                     the device(s) referenced. In most cases it is determined
  99.                     when the FOSSIL driver is installed through some sort of
  100.                     configuration file (or command line options) that relates
  101.                     the physical devices to logical port numbers. However, in
  102.                     order to make the FOSSIL implementation as compatible as
  103.                     possible with "normal" mode, the port number passed will
  104.                     have a value of ONE (1) subtracted from it before
  105.                     referring to the actual FOSSIL port. Therefore to access
  106.                     the first port (port 0), you pass a 1 as you did with in
  107.                     normal mode. Internally, one (1) is subtracted so that
  108.                     port 0 is referenced. This makes the implementation or
  109.                     normal and FOSSIL modes totally transparent.
  110.  
  111.                     Specifying a value of ZERO (0) for the port puts the
  112.                     driver in "local" mode. This is identical to normal mode.
  113.  
  114.  
  115.  
  116.         QBSERIAL User Manual - V 3.20                              Page 2
  117.  
  118.  
  119.  
  120.  
  121.           Parameter:     IRQ/Stat%
  122.  
  123.           Normal:   Specifies which interrupt to use with this port. If the
  124.                     value of IRQ% is ZERO (0), then the default IRQ values
  125.                     are used (COM1 & COM3 use IRQ4, COM2 & COM4 use IRQ3).
  126.                     This is what most applications will use. Specify an IRQ
  127.                     value of 1 through 15 when you want to use an IRQ value
  128.                     other than the default. Such as when you want to use
  129.                     IRQ15 with COM3. NOTE: Be careful when choosing an IRQ
  130.                     value other than the default. Most machines use some of
  131.                     the other IRQ inputs for other machine functions such as
  132.                     the Hard drive and system clock. QBserial DOES NOT chain
  133.                     the interrupt, it takes it over entirely. If you choose
  134.                     an IRQ that is used for something already, your machine
  135.                     will most certainly operate improperly.
  136.  
  137.           FOSSIL:   No IRQ value is necessary in FOSSIL mode since all
  138.                     communications tasks are handled outside of QBserial. The
  139.                     IRQ used with a particular "port" will be determined at
  140.                     the time the FOSSIL driver is installed, probably through
  141.                     the same configuration method mentioned above.
  142.  
  143.                     When using FOSSIL mode, this field is now Status. This is
  144.                     a value RETURNED to the programmer when OpenComm has
  145.                     completed. It indicates whether or not the FOSSIL driver
  146.                     initialized properly and is ready to perform
  147.                     communications tasks. A value of 1954h (HEX) or 6484
  148.                     (DECIMAL) indicates a successful initialization. ANY
  149.                     OTHER value indicates a initialization failure. You
  150.                     should terminate your program and inform the user of your
  151.                     program of the problem. Failures could result from the
  152.                     FOSSIL driver not being installed, or not installed
  153.                     properly. If you pass an invalid baud rate (see below),
  154.                     Status will be returned as a ZERO. Otherwise Status will
  155.                     be the actual value returned from the FOSSIL driver in
  156.                     response to initialization. These values other than
  157.                     1954h/6484 may offer a clue as to why the driver did not
  158.                     initialize. These "possible" values would be documented
  159.                     in the documentation for the FOSSIL driver.
  160.  
  161.           Parameter:     Wlen%
  162.  
  163.                     An integer specifying the word length of the serial data.
  164.                     It has a value of 7 or 8. Identical in both normal and
  165.                     FOSSIL modes.
  166.  
  167.           Parameter:     Parity%
  168.  
  169.                     An integer, 0 = NONE, 1 = ODD, 2 = EVEN. Identical in
  170.                     both normal and FOSSIL modes.
  171.  
  172.  
  173.  
  174.         QBSERIAL User Manual - V 3.20                              Page 3
  175.  
  176.  
  177.  
  178.  
  179.           Parameter:     Bits%
  180.  
  181.                     Specifies the number of Stop Bits on each serial
  182.                     character. Valid entries are: "1" for 1 Stop Bit, and "2"
  183.                     for 2 Stop Bits per character. Any other value will give
  184.                     1 Stop Bit. Identical in both normal and FOSSIL modes.
  185.  
  186.           Parameter:     Baud&
  187.  
  188.           Normal:   This is a LONG INTEGER representing the desired baud
  189.                     rate. Valid numbers are 0, 300, 1200, 2400, 4800, 9600,
  190.                     19200, 38400, 57600, and 115200. The value you send is
  191.                     NOT checked and I assume you could generate crazy baud
  192.                     rates if desired. 115200 is the absolute maximum rate
  193.                     that can be generated. If you specify a baud rate of ZERO
  194.                     then the serial port is used AS-IS. The rate, word
  195.                     length, & parity are NOT changed. This is useful for door
  196.                     operation since the port is already initialized at the
  197.                     proper settings when you get control.
  198.  
  199.           FOSSIL:   Identical to normal mode with the exception being that
  200.                     the range of selectable baudrates is limited. This is
  201.                     limited by the current FOSSIL specification. The valid
  202.                     baud rates are: 0, 300, 1200, 2400, 4800, 9600, 19200,
  203.                     and 38400. If you pass a value other than one of these
  204.                     valid rates, the driver will not initialize and return a
  205.                     ZERO for status. In FOSSIL mode, if you specify a baud
  206.                     rate of ZERO (0), the Baudrate initialization call is not
  207.                     performed by OpenComm. This *SHOULD* have the same effect
  208.                     that normal mode does by not changing the baudrate, word
  209.                     length, & parity. However, since this is an undefined
  210.                     condition in the FOSSIL specification, there is no way of
  211.                     guaranteeing that the current settings will not be
  212.                     changed during initialization of the driver. If you want
  213.                     a 100% guarantee of the rate setting, you should provide
  214.                     a speed when you do an OpenComm. This is only being done
  215.                     for compatibility with Normal mode.
  216.  
  217.           Parameter:     HS%
  218.  
  219.                     An integer specifying the type of handshake you wish to
  220.                     use between the CPU and Modem (or destination device).
  221.                     Valid numbers are: 0 = NO handshake, 1 = XON/XOFF, 2 =
  222.                     CTS/RTS, 3 = XON/XOFF and CTS/RTS. Identical in both
  223.                     modes.
  224.  
  225.           Parameter:     FOS%
  226.  
  227.                     An integer that specifies which mode the driver will
  228.                     operate in. Zero (0) specifies "Normal" mode, and One (1)
  229.                     specifies "FOSSIL" mode.
  230.  
  231.  
  232.         QBSERIAL User Manual - V 3.20                              Page 4
  233.  
  234.  
  235.  
  236.  
  237.                                      Serial Output
  238.  
  239.           To send a string of data out the serial port, you use the
  240.           "Transmit" call as follows:
  241.  
  242.                Temp$ = "Transmit this..."
  243.                Transmit Temp$
  244.  
  245.                     or
  246.  
  247.                Transmit "Send this also...."
  248.  
  249.           If you want to transmit single characters, you can use the
  250.           "WriteChar" function. Transmit calls WriteChar to send the actual
  251.           characters to the port. If you wish to use WriteChar, it has the
  252.           following format:
  253.  
  254.                Status% = WriteChar(Char%)
  255.  
  256.           Char% is the integer value of the character you want to send, it is
  257.           not a string. Status% is an integer returned by WriteChar, it is
  258.           NON-ZERO if the character was actually sent to the port, and ZERO
  259.           if the character was not sent. WriteChar will loop indefinitely on
  260.           CTS hold, XOFF hold, or Transmit Buffer Busy. These loops will exit
  261.           if carrier is lost in FULL or PARTIAL modes and return a ZERO
  262.           status% (This occurs in normal mode ONLY. What happens in FOSSIL
  263.           mode is undefined). WriteChar gives you more low level control of
  264.           the sending of characters, but you must send each character
  265.           separately and monitor its status.
  266.  
  267.           The Transmit function monitors the status of its calls to WriteChar
  268.           and triggers QuickBASIC's User Event trap (UEVENT) if a carrier
  269.           loss occurs in FULL mode. The UEVENT trap (FULL mode) is used by
  270.           default. You can disable the use of this event trap in the event
  271.           you already use the UEVENT trap for something else (PARTIAL mode).
  272.           Therefore, by default, carrier loss detection in your program is
  273.           done with the ON UEVENT GOSUB/UEVENT ON statements. The example
  274.           programs show the use of this method. By default UEVENT is also
  275.           used for catching carrier loss on keyboard input. this is described
  276.           below.
  277.  
  278.  
  279.  
  280.                                       Serial Input
  281.  
  282.           Serial input is managed with three functions: DataWaiting,
  283.           ReadChar, & ClearInputBuffer. DataWaiting is used to test the input
  284.           buffer to see if any characters need to be read from it. ReadChar
  285.           is then called to get the characters. ClearInputBuffer flushes the
  286.           input buffer of any existing characters. Both example programs
  287.           contain a subroutine called "KeyboardInput" that demonstrates the
  288.           use of these calls. It also properly handles input from the local
  289.  
  290.         QBSERIAL User Manual - V 3.20                              Page 5
  291.  
  292.  
  293.  
  294.  
  295.           and remote keyboards, and can be the routine you use in your
  296.           programs if you wish. Basically the procedure for reading the
  297.           remote keyboard (serial input) is as follows:
  298.  
  299.                IF DataWaiting THEN
  300.                     C$ = CHR$(ReadChar)
  301.                END IF
  302.  
  303.           The DataWaiting function also monitors the state of the carrier
  304.           detect signal and triggers, in FULL mode, the user event trap
  305.           (UEVENT) if carrier is lost. As you can see a singular trap routine
  306.           catches carrier loss on output as well as input. You will notice
  307.           that the "KeyboardInput" subroutine (in SIMPLE.BAS) loops using
  308.           DataWaiting, and as such, carrier is constantly checked while
  309.           waiting for input. If the ReadChar function is called when no data
  310.           is available (as indicated by DataWaiting) a NULL character is
  311.           returned.
  312.  
  313.           In "Normal" mode, if XOFF/XON, CTS/RTS, or BOTH is enabled, then
  314.           the serial buffer will be protected from overfills. When the buffer
  315.           reaches 75% of capacity, an XOFF will be sent on the serial output
  316.           or RTS will be dropped. When the buffer empties out to 25% of
  317.           capacity, an XON will be sent or RTS raised. The capacity of the
  318.           input buffer is 2048 bytes. In FOSSIL mode, the threshold points
  319.           where flow control occurs and the buffer size, are determined by
  320.           the FOSSIL driver.
  321.  
  322.  
  323.                                  Carrier Detect Control
  324.  
  325.           There are three modes of carrier detection: Full, Partial, & None.
  326.           Each has it own distinct use for a particular purpose. The driver
  327.           defaults to FULL carrier detection unless you change it. The
  328.           following call is used to change control modes:
  329.  
  330.                CarrierDetect 0 [or] 1 [or] 2
  331.  
  332.           Specifying a TWO (2) sets carrier detection to FULL. This is the
  333.           default mode. When a loss of carrier occurs while transmitting,
  334.           polling for input data, or sitting in a wait loop (XOFF/XON or
  335.           CTS), the driver will return to the calling program and trip the
  336.           UEVENT flag. Tripping the UEVENT flag causes Basic to go to the
  337.           User Event trap routine (providing ON UEVENT GOSUB/UEVENT ON has
  338.           been set up in the user program). You should use this mode only if
  339.           you want to use the UEVENT trap for carrier loss detection. You
  340.           cannot transmit data (with the Transmit function) in this mode if
  341.           there is no carrier. You can send characters in this mode with the
  342.           WriteChar function.
  343.  
  344.           Specifying a ONE (1) sets carrier detection to PARTIAL. This mode
  345.           is similar to FULL with the exception that the UEVENT flag is not
  346.           tripped when carrier is lost. This mode should be used if UEVENT is
  347.  
  348.         QBSERIAL User Manual - V 3.20                              Page 6
  349.  
  350.  
  351.  
  352.  
  353.           used for something else in your program, or you don't wish to
  354.           utilize UEVENT.
  355.  
  356.           Specifying a ZERO (0) sets carrier detection to NONE. An example of
  357.           this mode would be where "plain Jane" serial I/O is required (such
  358.           as communicating with a "dumb" terminal). In this application there
  359.           are no modem handshake signals (3 wire EIA/RS-232). This mode can
  360.           also be used for talking to a modem when there is no carrier signal
  361.           present (such as dialing and initialization commands). The Transmit
  362.           and WriteChar routines will always transmit data in this mode with
  363.           or without carrier present. Carrier detection must be disabled in
  364.           this mode to prevent calls to Uevent and disable the no carrier
  365.           escape mechanisms built into the XON/XOFF loops. Important: If you
  366.           are using "Normal" mode, and you are using the XOFF/XON protocol,
  367.           with "CarrierDetect 0" set, and receive an XOFF while transmitting,
  368.           you will sit forever waiting for an XON. This is a normal
  369.           condition, with the exception that there is no escape from this
  370.           loop other than XON. If you are using "FOSSIL" mode, this action is
  371.           undefined.
  372.  
  373.  
  374.                            Carrier Loss Detection by Polling
  375.  
  376.           As mentioned above, by default, the UEVENT trap is used to detect
  377.           when a loss of carrier occurs. There is also a function that allows
  378.           you to detect loss of carrier without using the UEVENT trap. While
  379.           I feel that using UEVENT is the simplest way to catch a carrier
  380.           loss in a program, it is possible that UEVENT might need to be used
  381.           by something else. This function is:
  382.  
  383.                X% = CarrierLost
  384.  
  385.           This function call allows to you to 'poll' for the state of
  386.           carrier. CarrierLost returns a NON-ZERO value when there is NO
  387.           carrier, and a ZERO when there IS carrier. CarrierLost is a real
  388.           time function, it returns the current carrier condition at the time
  389.           of the call. This allows you to code simple IF or DO loops to
  390.           detect loss:
  391.  
  392.                IF CarrierLost THEN
  393.                     ..process carrier loss
  394.                END IF
  395.  
  396.  
  397.                                       Modem Status
  398.  
  399.           NOTE:     This function ONLY works in Normal mode. It has no
  400.                     functional equivalent in FOSSIL mode.
  401.  
  402.           The Modem Status register contains bits that convey information
  403.           about the Modem's current state, and what has happened since the
  404.           last status query. In most instances these bits will not be needed
  405.  
  406.         QBSERIAL User Manual - V 3.20                              Page 7
  407.  
  408.  
  409.  
  410.  
  411.           for normal serial operations. This was added to provide additional
  412.           information about the device in use.
  413.  
  414.           Normal Mode:
  415.  
  416.                Modem Status Register:
  417.  
  418.               7       6       5       4       3       2       1       0   Bit
  419.                                                                            
  420.              128     64      32      16       8       4       2       1    
  421.            Carrier  Ring   DataSet  Clear   Delta   Delta   Delta   Delta  
  422.            Detect  Signal   Ready  To Send   CD      RI      DSR     CTS   
  423.                                                                            
  424.  
  425.           Bits 0 - 3 of this register report a change in the state of their  
  426.           respective RS-232 (signal) pins. A "1" in any of these bits means
  427.           that it's input has changed since last status read. Reading this
  428.           register clears bits 0 - 3. Bits 4 - 7 report the absolute state of
  429.           their respective RS-232 inputs (These bits are "real time").
  430.  
  431.           To use this function, the Basic statement would be:
  432.  
  433.                value% = ModemStatus
  434.  
  435.           The value returned by ModemStatus depends on the particular bit(s)
  436.           set in the Modem Status register. The corresponding decimal weights
  437.           are listed in the boxes in the above figure. As an example, if you
  438.           were monitoring the register and looking for a Ring Indication, you
  439.           would be looking for a value of 64. NOTE: If you are looking for a
  440.           particular value, you must AND the value you wish to test against
  441.           what ModemStatus returns. So, if you were looking for a Ring
  442.           Indication, you would use:
  443.  
  444.                St% = ModemStatus
  445.                if St% AND 64 then
  446.                     ... Ring detected
  447.  
  448.  
  449.                                                                            
  450.                        Program Termination                      
  451.  
  452.           Since "OpenComm" seizes an interrupt vector, this vector needs to
  453.           be restored BEFORE your program ends. If you neglect to restore
  454.           this vector, you could be risking a crash. The routine used to
  455.           reset the vector is: CloseComm. Only use CloseComm if you specified
  456.           a port value in the OpenComm call (Normal or FOSSIL modes). If you
  457.           specified a port value of ZERO (Local mode) the interrupt vector is
  458.           NOT grabbed, and does not need to be reset. In Normal mode,
  459.           CloseComm resets any UART registers to their original value. In
  460.           FOSSIL mode, how the UART registers are left is undefined.
  461.  
  462.  
  463.  
  464.         QBSERIAL User Manual - V 3.20                              Page 8
  465.  
  466.  
  467.  
  468.  
  469.  
  470.                                Data Terminal Ready (DTR)
  471.  
  472.           Everybody that has used QuickBASIC's OPEN COMn statement is very
  473.           familiar with the problems of the DTR signal. Apparently Microsoft
  474.           felt that DTR would never be needed after a program terminates.
  475.           Anybody who has ever tried to write a door, or chain from one
  476.           program to another has cursed this decision at some time during
  477.           their programs development. This driver handles the DTR with a
  478.           different view. When you close the comm channel the DTR signal is
  479.           left in the same state it was when you opened the comm channel. For
  480.           door applications, this is a must. 
  481.  
  482.           A function call is provided however that allows your program to
  483.           control the DTR signal:
  484.  
  485.           DTRcontrol 1 [or] 0           ' 0 = DTR OFF, 1 = DTR ON
  486.  
  487.           Additionally when you use DTRcontrol to change the state of the DTR
  488.           signal it also instructs the driver to leave it this way when the
  489.           CloseComm function is called. Remember that the driver leaves DTR
  490.           the way it found it when OpenComm was called. If you used some
  491.           other method to change DTR after OpenComm was called, it would
  492.           automatically return to that original state when you called
  493.           CloseComm. Therefor only DTRcontrol should be used if you wish to
  494.           change the state of DTR. This appears to operate identically in
  495.           normal and FOSSIL modes.
  496.  
  497.  
  498.                                  Request To Send (RTS)
  499.  
  500.           NOTE:     This function ONLY works in Normal mode. It has no
  501.                     functional equivalent in FOSSIL mode.
  502.  
  503.           Request To Send (RTS) is a hardware flow control signal used to
  504.           tell the remote device to STOP sending data to us. Normally RTS is
  505.           set "on" and data will always flow (or the signal is ignored at the
  506.           remote end). With some communications programs RTS is used to
  507.           temporarily stop a modem from sending data while I/O is done to a
  508.           slow disk. This is especially true with high speed communications
  509.           where there is very little time between interrupts. This function
  510.           is independent of the automatic RTS flow control selected by
  511.           handshake 2 or 3 which tells the remote device to stop sending when
  512.           the input buffer is almost full. This function allows you to
  513.           manually control the state of RTS so you could, for instance, go
  514.           off and write the data somewhere without fear of loosing data.
  515.  
  516.           RTScontrol 1 [or] 0           ' 0 = RTS OFF, 1 = RTS ON
  517.  
  518.           When you use RTScontrol to change the state of the RTS signal it
  519.           also instructs the driver to leave it this way when the CloseComm
  520.           function is called. The driver leaves RTS the way it found it when
  521.  
  522.         QBSERIAL User Manual - V 3.20                              Page 9
  523.  
  524.  
  525.  
  526.  
  527.           OpenComm was called. If you used some other method to change RTS
  528.           after OpenComm was called, it will automatically return to that
  529.           original state when you call CloseComm. Therefor only RTScontrol
  530.           should be used if you wish to change the state of RTS. This is
  531.           similar in the way DTRcontrol works.
  532.  
  533.  
  534.                                      Break Control
  535.  
  536.           Some serial devices require a "Break" signal to tell them to "wake
  537.           up" from an idle state and begin communication. A Break is a
  538.           sustained serial low signal (or space) for a period longer than one
  539.           serial character time. To cause QBserial to send a Break signal,
  540.           use the following statement:
  541.  
  542.           BREAKcontrol [1] or [0]            ' 0 = Normal, 1 = Break
  543.  
  544.           Executing a "BREAKcontrol 1" statement causes the serial output
  545.           signal to enter the Break state. The output line will remain in
  546.           this state until a "BREAKcontrol 0" statement is executed. It is up
  547.           to the user to time the duration of the required break signal.
  548.           Using the following lines will give a Break signal of 1 second:
  549.  
  550.                BREAKcontrol 1
  551.                SLEEP 1
  552.                BREAKcontrol 0
  553.  
  554.  
  555.                               Driver Version and Copyright
  556.  
  557.           A function is available to access the drivers version and copyright
  558.           string. This would be used if you wish to display in your final
  559.           product the version of QBserial that your are using, and/or my
  560.           copyright along with yours. In order to access the copyright
  561.           string, the following lines should be added to your Basic program:
  562.  
  563.                     X& = DriverCopyright
  564.                     WHILE (PEEK(X&))
  565.                          CP$ = CP$ + CHR$(PEEK(X&))
  566.                          X& = X& + 1
  567.                     WEND
  568.  
  569.           This places the version/copyright string into string variable CP$.
  570.           This string may now be handled in whatever method you choose.
  571.  
  572.  
  573.                                  Crescent's PDQ Library
  574.  
  575.           An object module for use with PDQ is also included. PDQ does not
  576.           support UEVENT, so all references to UEVENT in the text should be
  577.           ignored. You will need to do carrier checking by polling with the
  578.           CarrierLost function. If you use FULL mode and carrier is lost it
  579.  
  580.         QBSERIAL User Manual - V 3.20                             Page 10
  581.  
  582.  
  583.  
  584.  
  585.           will operate the same way as PARTIAL mode. The only exception to
  586.           this is the Transmit function, which when in FULL or PARTIAL mode,
  587.           will not transmit data.
  588.  
  589.  
  590.  
  591.                                         Linking
  592.  
  593.           Since object modules are provided for QB4.x, BC7, VBDOS, and PDQ,
  594.           you will need to select the proper one to use for your program. The
  595.           file QBSER.OBJ should be used for programs compiled with
  596.           QuickBASIC. BC7SER.OBJ is to be used for programs compiled with BC7
  597.           PDS, and Visual Basic for DOS. QBSERPDQ.OBJ is for PDQ users.
  598.           Typical link command lines would look like this: (Please note that
  599.           your command lines will probably be different if you use additional
  600.           libraries to generate your code). The term "yourprog" is meant to
  601.           imply any code modules necessary for linking your project. This
  602.           could one .OBJ file, or many. Please note that compiling any
  603.           linking projects from within the QB/QBX/VBDOS development
  604.           environment(s) is not supported.
  605.  
  606.  
  607.           Link yourprog qbser;               (For QuickBASIC)
  608.  
  609.           Link yourprog bc7ser;              (For BC7 PDS and Visual Basic)
  610.  
  611.           Link yourprog qbserpdq acrtused;   (For PDQ)
  612.                                     ^
  613.                                           See note about acrtused.obj
  614.  
  615.           NOTE:     In the past the file ACRTUSED.OBJ was required to be
  616.                     linked in when using the PDQ replacement libraries. This
  617.                     was necessary to satisfy a dummy external call. It
  618.                     appears that it may no longer be necessary to link with
  619.                     this file anymore. You should try linking without
  620.                     acrtused, and see if a link error occurs. If no error
  621.                     occurs, then you do not need to specify it.
  622.  
  623.  
  624.  
  625.                                     Quick Libraries
  626.  
  627.           If you wish to develop programs from within the environment, you
  628.           will first need to create a Quick library using one of the object
  629.           modules QBSER.OBJ, BC7SER.OBJ, or QBSERPDQ.OBJ. To create a Quick
  630.           lib for QuickBASIC 4.x, use the following Link command:
  631.  
  632.                Link QBSER,,,BQLB4x/q
  633.  
  634.           Where "BQLB4x" is one of the following: BQLB40.LIB, BQLB41.LIB, or
  635.           BQLB45.LIB. Use the one that came with your compiler. If you use
  636.           the wrong BQLB file you might get an "Invalid Format" error when
  637.  
  638.         QBSERIAL User Manual - V 3.20                             Page 11
  639.  
  640.  
  641.  
  642.  
  643.           attempting to start QuickBASIC. QBSER.OBJ may also be added to
  644.           Quick Libraries containing other routines and OBJ's as well.
  645.  
  646.           To create a Quick Library for use within QBX (BC7's environment)
  647.           use the following link command (IMPORTANT: be sure to use Link
  648.           v5.xx that came with BC7 or you will receive linking errors):
  649.  
  650.                Link BC7SER,,,QBXQLB/q;
  651.  
  652.           To create a Quick Library for use within Visual Basic's environment
  653.           (VBDOS) use the following link command (IMPORTANT: be sure to use
  654.           Linker that came with VBDOS or you will receive linking errors):
  655.  
  656.                Link BC7SER,,,VBDOSQLB/q;
  657.  
  658.           For PDQ, use the method for QB4.x, since you will be using the
  659.           built in run time routines built into the environment. You ONLY use
  660.           QBSERPDQ.OBJ when you link the EXEcutable file.
  661.  
  662.           Remember too, that you can also add BC7SER.OBJ to Quicklibs
  663.           containing other routines.
  664.  
  665.                                      Specifications
  666.  
  667.           The following port addresses and default interrupts are used in
  668.           Normal mode:
  669.  
  670.                Comm      Base Address        IRQ (Default)
  671.  
  672.                 1          3F8 hex            4
  673.                 2          2F8 hex            3
  674.                 3          3E8 hex            4
  675.                 4          2E8 hex            3
  676.  
  677.           Please read the section explaining the OpenComm function for
  678.           information on how to use addresses or IRQ's other than the
  679.           defaults.
  680.  
  681.  
  682.                                 Registration and Support
  683.  
  684.           QBserial is distributed as shareware. You may copy and distribute
  685.           it freely, as long as you do NOT modify it or add (or remove) any
  686.           files to it.
  687.  
  688.           QBserial is not free software, and requires registration. There are
  689.           two classes of registration which are dependant upon use:
  690.           Commercial and Non-Commercial.
  691.  
  692.           Registration of QBserial is $25 for non-commercial use. Non-
  693.           commercial uses are: Personal use, or use in another shareware
  694.           product such as doors and utilities where you allows others to try
  695.  
  696.         QBSERIAL User Manual - V 3.20                             Page 12
  697.  
  698.  
  699.  
  700.  
  701.           the product first before buying and request a nominal registration
  702.           fee. Source code is available as an option for an additional $50.
  703.  
  704.           Registration of QBserial for commercial use is $75. Commercial uses
  705.           are: Inclusion of QBserial into ANY product that is to be sold for
  706.           profit, or any use of this program in a business environment. Any
  707.           program that must be paid for in advance before the product is
  708.           delivered, or use in a corporate environment fits this category.
  709.           Commercial registration includes the source code for QBserial in C
  710.           (Microsoft C), if desired.
  711.  
  712.           Please register your copy!
  713.  
  714.           Software and Shareware distribution houses may charge a nominal
  715.           distribution and copying fee not to exceed $5.00. They may not sell
  716.           this program outright or ask you for the registration fee directly,
  717.           they must tell you that registration is required by the author.
  718.  
  719.           If you have access to a BBS that is an ILink network member, you
  720.           can reach me in the respective Basic conferences. If you do not
  721.           have ILink access anywhere nearby, then you can always contact me
  722.           on the SailBoard BBS at the number listed below. I would prefer if
  723.           you contact me directly on the SailBoard however, as mail networks
  724.           aren't always as reliable as I'd like, and I have missed messages.
  725.           I'll do the best I can to help if you have questions. Bugs will be
  726.           tended to if required, and good suggestions tend to be implemented.
  727.  
  728.  
  729.                                       Source Code
  730.  
  731.           The source code for QBserial is available. The source is available
  732.           by signing at the appropriate place on the registration form. The
  733.           source may be used for you own internal uses only. The source may
  734.           not be distributed by you to any other person, even if you make
  735.           changes to it. Nor can the resulting object code be sold or
  736.           distributed. Modifications can only be used in your end product,
  737.           and without any type of royalty. The source is available only after
  738.           you register QBserial. The license fee for the QBserial source code
  739.           is $50.00 for Non-Commercial users. Commercial users receive the
  740.           source as part of their registration fee if they desire it.
  741.  
  742.                                       Jeff Sumberg
  743.                                Sysop of the SailBoard BBS
  744.                                Ringwood, NJ, 201-831-8152
  745.  
  746.                                         [ or ]
  747.  
  748.                                         Box 212
  749.                                   Ringwood, NJ, 07456
  750.  
  751.  
  752.  
  753.  
  754.         QBSERIAL User Manual - V 3.20                             Page 13
  755.  
  756.  
  757.  
  758.  
  759.                                     Acknowledgments
  760.  
  761.           Thanks go out to Mark "Sparky" Herring for using these routines in
  762.           his highly successful Qmail door.
  763.  
  764.           Thanks to Brent Yandell for using these routines in his PCBoard
  765.           File Viewer PCBFV and PCBFX programs.
  766.  
  767.           Thanks to Mark Wilson for some very good ideas in version 2.0.
  768.           Thanks to Michael Conley for finding a real time sensitive
  769.           interrupt problem and for providing very useful information.
  770.           Thanks to Jeffrey Morley (author of ZipLab) for testing.
  771.  
  772.  
  773.                                Distribution File Contents
  774.  
  775.            QBSER.OBJ     QBserial object module for use with QuickBASIC
  776.                          version 4.x.
  777.  
  778.            QBSERPDQ.OBJ  QBserial object module for use with PDQ and
  779.                          QuickBASIC 4.x or PDQ with Basic Compiler 7.x (NEAR
  780.                          string model).
  781.  
  782.            BC7SER.OBJ    QBserial object module for use with Basic Compiler
  783.                          6.x, Basic Compiler 7.x (NEAR or FAR string models),
  784.                          and Visual Basic for DOS.
  785.  
  786.            ACRTUSED.OBJ  Dummy object module to satisfy an external reference
  787.                          when linking with PDQ files. May no longer be
  788.                          necessary. See Text.
  789.  
  790.            OFFHOOK.BAS   Sample Basic program. Used to take modem off hook.
  791.                          References PCBoard data files for port info. Can
  792.                          also be used stand alone.
  793.  
  794.            PCBDOOR.BAS   Very simple frame for creating a door in PCBoard.
  795.                          Should be used ONLY as a guide.
  796.  
  797.            SIMPLE.BAS    Very simple "do nothing" program offering examples
  798.                          of how to call QBserial functions.
  799.  
  800.            QBSERIAL.DEC  Function declarations for QBserial.
  801.  
  802.            QBSERIAL.DOC  QBserial Documentation (this file).
  803.  
  804.            READ.ME       Latest changes to QBserial.
  805.  
  806.            REGISTER.FRM  QBserial Registration form. Please Register your
  807.                          copy.
  808.  
  809.            FILE_ID.DIZ
  810.            DESC.SDI      BBS description files.
  811.  
  812.         QBSERIAL User Manual - V 3.20                             Page 14
  813.  
  814.  
  815.  
  816.  
  817.  
  818.                                  Changes and Revisions
  819.  
  820.           06/09/89  1.0  Initial Release
  821.  
  822.           06/21/89  1.1  Added carrier detection control. Calling program can
  823.                          turn detection off and on as desired. Necessary if
  824.                          data sending/receiving required if carrier isn't
  825.                          present.
  826.  
  827.           09/01/89  1.2  Fixed a bug in Readchar where 'extended' characters
  828.                          (ASCII 128 to 255) were causing an Illegal Function
  829.                          Call in the CHR$() conversion (because they were
  830.                          being returned as negative numbers). Extended
  831.                          character may now be received properly. Added three
  832.                          new functions: CDtrap, CarrierLost, and DTRcontrol.
  833.  
  834.  
  835.           03/24/90  1.5  Added support for Basic Compiler 7.0 PDS and PDQ.
  836.                          Added sections to manual about Linking, Source code
  837.                          availability, and updated section on Quicklibs.
  838.                          Separate object files now supplied for QB, BC7, and
  839.                          PDQ.
  840.  
  841.           05/01/90  1.6  Oops! PDQ users found out fast that I forgot to
  842.                          compile the PDQ module with stack checking removed.
  843.                          I also forgot to include ACRTUSED.OBJ to satisfy
  844.                          linking requirements. Sorry 'bout that! Released
  845.                          only as beta to those that needed it.
  846.  
  847.           11/01/90  2.0  Added capability to specify non-standard port
  848.                          addresses and which IRQ to use when the port is
  849.                          opened. Removed CDtrap function. Created new carrier
  850.                          detection modes using the CarrierDetect function. (0
  851.                          = NONE, 1 = PARTIAL, 2 = FULL). Also added
  852.                          DriverCopyright function to allow program access to
  853.                          the driver version.
  854.  
  855.           02/08/92  2.10 Added RTS flow control support. RTS will be used to
  856.                          control data coming in to QBserial when the
  857.                          handshake is set to 2 (CTS/RTS). Removed necessity
  858.                          for SERIAL.LIB library file by adding inline
  859.                          assembler that performed the routines that were
  860.                          previously included in that library. QBserial is now
  861.                          compiled with Microsoft C 6.0 which will give
  862.                          smaller, faster, and more efficient code than QuickC
  863.                          could generate. This is especially true in the
  864.                          interrupt area. Added new function RTScontrol, to
  865.                          allow program to control RTS line directly.
  866.                          Increased size of input buffer from 1024 to 2048
  867.                          bytes. Changed method in which interrupt controller
  868.                          mask bits were set & cleared. Corrected error found
  869.  
  870.         QBSERIAL User Manual - V 3.20                             Page 15
  871.  
  872.  
  873.  
  874.  
  875.                          in documentation describing the function of
  876.                          CarrierDetect.
  877.  
  878.           06/20/92  2.20 Added support for extended IRQs. QBserial now
  879.                          supports IRQ 8 - 15. Added a new sample program to
  880.                          the QBserial distribution package (OFFHOOK.BAS) to
  881.                          demonstrate usage of QBserial.
  882.  
  883.           07/05/92  2.25 While experimenting with some programs of my own I
  884.                          found a some errors in the disabling of the IRQ
  885.                          masks on the Interrupt Controller when exiting from
  886.                          QBserial. The program has been changed so that if
  887.                          the IRQ you specify is already turned ON when
  888.                          OpenComm executes, QBserial will leave it ON when
  889.                          you do a CloseComm. In versions since 2.10, the IRQ
  890.                          mask was always turned OFF when CloseComm was
  891.                          executed. This caused other communications programs
  892.                          such as BBS's that don't reset the port when
  893.                          returning from QBserial to appear to "lock up" when
  894.                          they regained control.
  895.  
  896.           11/01/92  3.00 Added the ability for QBserial to use FOSSIL
  897.                          drivers. Modified the OpenComm call to allow the
  898.                          programmer to specify which mode to operate in. The
  899.                          QBSERIAL.DEC file has changed and the one provided
  900.                          with this version MUST be used when upgrading to
  901.                          this version. Added new function: ModemStatus, to
  902.                          read the Modem Status register of the UART. This is
  903.                          a normal mode function only.
  904.  
  905.           06/12/93  3.10 This version is a bug fix version. Several minor
  906.                          errors and omissions have been reported by users,
  907.                          and these have been corrected in this version. These
  908.                          include:
  909.                          - Modified the QBSERIAL.DEC file to allow Qbserial
  910.                          to work with Visual Basic for DOS. This is because
  911.                          of an unknown, undocumented change in the way
  912.                          DECLARE works in Visual Basic for DOS.
  913.                          - ClearInputBuffer did not work in FOSSIL mode.
  914.                          - Modified OpenComm to reset flow control flags,
  915.                          buffer pointers, etc. It was found that if a port
  916.                          was opened, used, closed, then opened again without
  917.                          program termination or chain from program to
  918.                          program, that the Flow Control mode would be wrong
  919.                          or inoperative. The input buffer also was not
  920.                          flushed when a port was opened. This was because
  921.                          initialization to these flags and pointers was only
  922.                          being done when the EXE was loaded, not during
  923.                          OpenComm. These are done within OpenComm.
  924.  
  925.           09/01/93  3.20 Modified the OpenComm call to allow the programmer
  926.                          to specify the number of Stop Bits required (1 or 2)
  927.  
  928.         QBSERIAL User Manual - V 3.20                             Page 16
  929.  
  930.  
  931.  
  932.  
  933.                          for communication. Important: The QBSERIAL.DEC file
  934.                          has changed and the one provided with this version
  935.                          MUST be used when upgrading to this version. Added a
  936.                          new function "BREAKcontrol" to allow the programmer
  937.                          to send Break signals to remote devices.
  938.  
  939.  
  940.  
  941.  
  942.  
  943.  
  944.  
  945.  
  946.  
  947.  
  948.  
  949.  
  950.  
  951.  
  952.  
  953.  
  954.  
  955.  
  956.  
  957.  
  958.  
  959.  
  960.  
  961.  
  962.  
  963.  
  964.  
  965.  
  966.  
  967.  
  968.  
  969.  
  970.  
  971.  
  972.  
  973.  
  974.  
  975.  
  976.  
  977.  
  978.  
  979.  
  980.  
  981.  
  982.  
  983.  
  984.  
  985.  
  986.         QBSERIAL User Manual - V 3.20                             Page 17
  987.