[comp.lang.pascal] Com ports & baud rates

LAUFMAN-H@osu-20.ircc.ohio-state.edu (Harry Laufman) (12/04/89)

I'm TRYING to write a brief communication program which sets the COM
ports, dials, etc. using the Turbo PORT[n] array rather than calls
to MSDOS() and INTR().  Can this be done?  Included is code fragment
showing my idea, which doesn't work.  The program works if I first
Mode Com1: 24,n,8,1... but if I try to change the baud rate, parity
etc. the modem subsequently does not respond with its "OK" to ANY
modem command and the program hangs.  The functions INREADY, XMITCHAR,
and RECVCHAR seem functionally sound as a terminal.
I use a record for the ComPorts of
      Com2Port :ComPortAddress = (io_data       :$2f8;
                                  line_control  :$2fb;
                                  line_status   :$2fd;
                                  modem_control :$2fc;
                                  modem_status  :$2fe;
                                  inter_enable  :$2f9);
where the fields are words and reassign port used with
      ComPortUsed:=Com2Port;
 
 
Function Inready: Boolean;
  begin
    Inready := (port[ComPortUsed.Line_Status] and 1) > 0;
  end;
Function RecvChar: Char;
  begin
     RecvChar := chr(port[ComPortUsed.io_Data]);
  end;
Procedure XmitChar(ch:char);
  begin
    port[ComPortUsed.io_Data]:=Ord(ch);
    delay(DelaySec1000);
  end;
Procedure AdjustMode(NewByte:Byte);
begin
Port[ComPortUsed.Line_Control]:=NewByte;
end;
 
 
Var Choice:Char;
 
Procedure SetComMode;
Var NewByte:Byte;
begin
GoToXY(1,4);
Writeln(' (1)  300 N 8 1  (2)  300 E 7 1  (7) COM1');
Writeln(' (3) 1200 N 8 1  (4) 1200 E 7 1  (8) COM2');
Writeln(' (5) 2400 N 8 1  (6) 2400 E 7 1');
Write  ('        Your Choice (Q)uit : ');
Choice:=Readkey;
{** Line Control Register
      bit 7  baud    for 765 :(000=110,001=130,011=600,100=1200,101=2400)
          6  baud
          5  baud
          4  Even Parity
          3  Parity Enable
          2  1 or 2 (0 or 1) Stop bits
          1  Always 1
          0  7 or 8 (0 or 1) Data bits     **}
 
Case Choice of
  '1':AdjustMode($43);  { 01000011 }
  '3':AdjustMode($83);  { 10000011 }
  '5':AdjustMode($A3);  { 10100011 }
  '2':AdjustMode($5E);  { 01011110 }
  '4':AdjustMode($9E);  { 10011110 }
  '6':AdjustMode($BE);  { 10111110 }
  '7':ComPortUsed:=Com1Port;
  '8':ComPortUsed:=Com2Port;
  end;
end;
 
Thanks for any advice.  Harry