Using Basic to Perform Serial Communications in MS OS/2 (48400)
This article was previously published under Q48400
SUMMARY
This article contains a module of sample Basic routines that call API
routines in MS OS/2 protected mode to perform serial communications
through communications port COM1, COM2, COM3, or COM4. Writing a
working communications program (COM.BAS) to call these routines is
a programming task left to you.
You must link NOCOM.OBJ (which requires BC /O) with this module before
attempting to use this module's routines.
This information applies to Microsoft Basic Compiler versions 6.0 and
6.0b for MS OS/2 (in protected mode only) and to Microsoft Basic
Professional Development System (PDS) versions 7.0 and 7.1 for MS OS/2
(in protected mode only).
MORE INFORMATION
The following steps must be taken to use the COMPORT.BAS module
(farther below):
- Create a program called COM.BAS that makes calls to the routines
found in COMPORT.BAS and compile the program. You must
be knowledgeable in communications program design, and must
write COM.BAS (not provided) as desired.
- Compile COMPORT.BAS (provided below). Ensure that COMPORT.BI
(shown below) and BSEDOSFL.BI (included with Basic compiler
6.0/6.0b and Basic PDS 7.0/7.1) are in a directory that is in
the $INCLUDE statement's explicit path.
- Link your program to COMPORT.OBJ in addition to NOCOM.OBJ.
The following is a sample file that, when used as input for the MAKE
utility, compiles and links a program called COM.BAS that uses the
COMPORT module:
#----------------------
# MAKE file for COM.BAS
#----------------------
comport.obj : comport.bas comport.bi
BC /LP /Z /O /D COMPORT.BAS;
com.obj : com.bas comport.bi
BC /LP /Z /O /D COM.BAS;
com.exe : com.obj comport.obj
link /EX com comport nocom;
COMPORT.BI
----------
' parameter buffer for DosDevIOCtrl Function 41H
TYPE F41Info
BaudRate AS INTEGER
END TYPE
' parameter buffer for DosDevIOCtrl Function 42H
TYPE F42Info
DataBits AS STRING * 1
Parity AS STRING * 1
StopBits AS STRING * 1
END TYPE
' data buffer for DosDevIOCtrl Function 68H
TYPE F68Info
NumChars AS INTEGER ' Number of characters waiting in device queue
QueueSize AS INTEGER ' Size of queue
END TYPE
DECLARE FUNCTION InitComPort% (ComPort$, Baud%, Parity%, DataBit%,StopBit%)
DECLARE SUB WriteCom (Handle%, ToCom$, BytesWritten%)
DECLARE SUB PrintCom (Handle%, ToCom$, BytesWritten%)
DECLARE SUB ReadCom (Handle%, FromCom$, BytesToRead%, BytesRead%)
DECLARE SUB ComSize (Handle%, Size%)
DECLARE SUB CloseCom (Handle%)
COMPORT.BAS
-----------
' $INCLUDE: 'COMPORT.BI'
' $INCLUDE: 'BSEDOSFL.BI'
' Note:
' These routines call OS/2 system functions
' that always return a value indicating whether or not an
' error has occurred. In this module, ReturnErr% always
' contains this value. A return value of 0 means no error
' occurred. This module does no error checking. This would
' have to be added using the values in ReturnErr%.
' For added flexibility in configuring the port, use
' DosDevIOCtrl Function 53H.
' All of the routines in this module (except
' InitComPort%) need a Handle% as one of the parameters.
' This Handle% is obtained from InitComPort%
'***********************************************************
' InitComPort% returns a handle to the comport specified in
' the parameter ComPort$ (must be in the form: "COMn" where
' n is a number between 1 and 4.) Before the handle to the
' port is returned, the port is configured to the correct
' baud rate (110 to 19200), parity, data bit, and stop bit.
'***********************************************************
FUNCTION InitComPort% (ComPort$, Baud%, Parity%, DataBit%,_
StopBit%)
DIM F42 AS F42Info
DIM F41 AS F41Info
DIM Temp AS STRING * 5 'Temp holds string of form "COMn"+null byte
Temp = ComPort$
F41.BaudRate = Baud%
F42.DataBits = CHR$(DataBit%)
F42.Parity = CHR$(Parity%)
F42.StopBits = CHR$(StopBit%)
ReturnErr% = DosOpen% (VARSEG(Temp), VARPTR(Temp),_
Handle%,_
Action%,_
0,_
0,_
1,_
&H12,_
0)
IF (ReturnErr% = 0) THEN
ReturnErr% = DosDevIOCtl%(0, 0,_
VARSEG(F41), VARPTR(F41),_
&H41,_
1,_
Handle%)
ReturnErr% = DosDevIOCtl%(0, 0,_
VARSEG(F42),VARPTR(F42),_
&H42,_
1,_
Handle%)
END IF
InitComPort% = Handle%
END FUNCTION
'***********************************************************
' WriteCom writes a string (ToCom$) to the port associated
' with Handle%. BytesWritten% will contain the actual
' number of bytes written after the call to WriteCom.
'***********************************************************
SUB WriteCom (Handle%, ToCom$, BytesWritten%)
DIM Temp AS STRING * 512
Temp = ToCom$
Length = LEN(ToCom$)
ReturnErr% = DosWrite%(Handle%,_
VARSEG(Temp), VARPTR(Temp),_
Length,_
BytesWritten%)
END SUB
'***********************************************************
' PrintCom Prints a string (ToCom$) to the port associated
' with Handle%. The string is written and an additional CR
' and LF. BytesWritten% will contain the actual number of
' bytes written after the call to PrintCom.
'***********************************************************
SUB PrintCom (Handle%, ToCom$, BytesWritten%)
ToCom$ = ToCom$ + CHR$(13) + CHR$(10)
DIM Temp AS STRING * 512
Temp = ToCom$
Length = LEN(ToCom$)
ReturnErr% = DosWrite%(Handle%,_
VARSEG(Temp), VARPTR(Temp),_
Length,_
BytesWritten%)
END SUB
'***********************************************************
' ReadCom reads BytesToRead% number of bytes from the port
' associated with Handle%. The bytes read are placed in
' FromCom$, and the number of bytes read will be placed in
' BytesRead%.
'***********************************************************
SUB ReadCom (Handle%, FromCom$, BytesToRead%, BytesRead%)
DIM Temp AS STRING * 512
ReturnErr% = DosRead%(Handle%,_
VARSEG(Temp), VARPTR(Temp),_
BytesToRead%,_
BytesRead%)
FromCom$ = MID$(Temp,1,BytesRead%)
END SUB
'***********************************************************
' ComSize returns the number of bytes waiting to be read at
' the port associated with Handle%. The number of bytes
' waiting is placed in Size%.
************************************************************
SUB ComSize (Handle%, Size%)
DIM F68 AS F68Info
DIM FileInfo AS FILESTATUS
ReturnErr% = DosDevIOCtl%(VARSEG(F68), VARPTR(F68),_
0, 0,_
&H68,_
1,_
Handle%)
Size% = F68.NumChars
END SUB
'***********************************************************
' CloseCom closes the port associated with Handle%. This
' should be called before the end of the program.
'***********************************************************
SUB CloseCom (Handle%)
ReturnErr% = DosClose% (Handle%)
END SUB
Modification Type: |
Minor |
Last Reviewed: |
1/9/2003 |
Keywords: |
KB48400 |
|