[Back to COMM SWAG index] [Back to Main SWAG index] [Original]
{
Can anyone tell me how you would set the baud rate for a speed above 9600 BP
in the bit mask for int 14h. also how you could do a Null modem type
connection.
You can't. You must program the divisor in the uart your self
for those higher baudrates. Here's part of a serial routine I
use:
}
Unit SerialIn;
{F+}
Interface
Uses Crt,Dos;
Const CommPort = $3F8; { normally com1 = $3F8 and com2 = $2F8 }
CommIrq = 4; { normally com1 = 4 and com2 = 3 }
BaudRate = 9600; { 300 - 9600 }
Parameters = $03; { 7 6 5 4 3 2 1 0
+-+-+ +-+ | +-+--- width 10 = 7 bits
don't | | 11 = 8 bits
care | +------- stopbit 0 = 1 bit
| 1 = 2 bit
+---------- parity X0 = none
01 = odd
11 = even }
BufferSize = 1000; { Size of receiver buffer }
IntMask : Array[2..5] of Byte = ($FB,$F7,$EF,$DF);
Var ComBuffer : Array[0..Buffersize] of Byte;
HeadPtr,
TailPtr : Integer;
OldCommInt : Pointer;
Procedure ComInit; { Initialize serial port }
Procedure ComDisable; { Disable serial port }
Procedure SendChar(Ch:Char); { Send character to serial port }
Procedure SendString(Message:String); { Send string to serial port}
Function GetChar:Char; { Get character from serial port }
Function GetCharWait:Char; { Wait for character ready, then get }
Function CharReady:Boolean; { Returns true if character has been }
{ received through serial port }
Implementation
Procedure ComInit; { get the serial port ready for use }
Var Divisor : Integer; { this routine MUST be called before }
Dummy : Integer; { using serial port! }
Begin
Case BaudRate of
300 : Divisor := 384;
1200 : Divisor := 96;
2400 : Divisor := 48;
9600 : Divisor := 12;
19200 : Divisor := 6;
3840 : Divisor := 3;
5760 : Divisor := 2;
11520 : Divisor := 1;
Else WriteLn('Illegal Baudrate');
End;
Port[CommPort+3] := $80; { Set divisor latch bit }
Port[CommPort] := Lo(Divisor); { Set lower divisor }
Port[CommPort+1] := Hi(Divisor); { set upper divisor }
Port[CommPort+3] := Parameters; { clear divisor latch and }
{ set data parameters }
HeadPtr := 0; { reset buffer pointers }
TailPtr := 0;
GetIntVec(CommIrq+8,OldCommInt); { Save the old vector }
SetIntVec(CommIrq+8,@ComIntHandler); { Install interrupt handler }
Port[CommPort+1] := 1; { Enable receiver interrupt }
Port[CommPort+4] := 9; { Enable DTR and OUT2 }
Port[$21] := Port[$21] And
IntMask[CommIrq]; { Program 8259 Int mask }
Dummy := Port[CommPort]; { Read the receiver register }
End; { to clear status flags }
[Back to COMM SWAG index] [Back to Main SWAG index] [Original]