[Back to COMM SWAG index]  [Back to Main SWAG index]  [Original]

{
> Could anybody PLEASE tell me how I can send a string (for example
> 'ATH1') to the modem? I want to create a program that dials a number
> and then automaticly enters a few other numbers....
> so, for example:

Without giving you a complete com-unit here's something that will do the
trick.
}
uses crt;
const
  RBR     = $00;             { Receive Buffer offset               }
  THR     = $00;             { Transmitter Holding offset          }
  IER     = $01;             { Interrupt Enable offset             }
  IIR     = $02;             { Interrupt Identification offset     }
  LCR     = $03;             { Line Control offset                 }
  MCR     = $04;             { Modem Control offset                }
  LSR     = $05;             { Line Status offset                  }
  MSR     = $06;             { Modem Status offset                 }
  DLL     = $00;             { Divisor Latch Low byte              }
  DLH     = $01;             { Divisor Latch Hi byte               }
  CMD8259 = $20;             { Interrupt Controller Command offset }
  IMR8259 = $21;             { Interrupt Controller Mask offset    }

Var Combase: Word;           { Hardware Com-port Base Adress }

Function Carrier : boolean;
{ To detect carrier on remote port, requires combase to be set to the  }
{ correct com base address                                             }
begin
  carrier := port[Combase + MSR] and $80 = $80;
end;

Procedure RaiseDTR;
{ To raise the DTR signal bit 0 of the mcr must be changed to on       }
begin
  port[combase + msr] := port[combase + mcr] or $1;
end;

Procedure LowerDTR;
{ To lower the DTR signal, causing carrier loss, bit 0 must be turned  }
{ off                                                                  }
begin
  port[combase + msr] := port[combase + mcr] and not $1;
end;

Procedure Writeport(st : string);
{ This procedure takes a string from the parameters and sends each          }
{ character making sure that the com base address is not equal to 0 (not    }
{ Installed)                                                                }
Var
  Count,LoopLimit: word; { Time out counter }
  loop: byte;
Begin
  LoopLimit := 2000;
  for loop := 1 to length(st) do begin
    Count := 0;
    Repeat
      inc(Count);
    Until ((port[Combase + LSR] and $20) <> 0) or (Count > LoopLimit);
    If Count < LoopLimit then port[Combase+THR] := byte(st[loop]);
  End;
End;

Procedure Hangup;
{ To drop carrier to hangup the phone -- Simple eh? }
Begin
  lowerdtr;   { Drop DTR }
  delay(500);
  { If the modem can't handle DTR drops go back to grade school and use }
  { Hayes compatiable hangups }
  if carrier then begin
    writeport('+++');
    delay(1000);
    writeport('ATH0'#13);
  End;
End;

Procedure Initport(Cb : word; Baudrate : word; Bits : Byte; Parity : Char; Stop
: byte);Var
  tempstop,temppar: byte;
  tempbaud: word;
Begin
  Combase := Cb;                                   { Set Comport baseadress }

  if stop = 1 then tempstop := $0                  { Decode the stopbits    }
    else tempstop := $04;
  case upcase(Parity) of                           { Decode parity          }
    'S': tempPar := $38;
    'O': tempPar := $08;
    'M': tempPar := $28;
    'E': tempPar := $18;
    'N': tempPar := $00;
  end;
  case baudrate of                                 { Decode baud rate       }
    110     : tempbaud := $417;
    150     : tempbaud := $300;
    300     : tempbaud := $180;
    600     : tempbaud := $C0;
    1200    : tempbaud := $60;
    2400    : tempbaud := $30;
    4800    : tempbaud := $18;
    9600    : tempbaud := $0C;
    19200   : tempbaud := $06;
{   38400   : tempbaud := $03;
    57600   : tempbaud := $02;
    115200  : tempbaud := $01; {-- Outside of ordinal range}
  End;

  port[Combase+LCR] := $80;                        { Adress Divisor Latch   }
  port[Combase+DLH] := Hi(tempbaud);               { Set Baud rate          }
  port[Combase+DLL] := Lo(tempbaud);
  port[Combase+LCR] := $00 or temppar              { Setup Parity           }
                             or (Bits - 5)         { Setup databits         }
                             or tempstop;          { Setup stopbits         }
  port[Combase+MCR] := $0B;                        { Set RTS, DTR           }
End;

begin
  initport($3F8,19200,8,'N',1);
  writeport('ATD'#13);
end.

{
Please note that this program is well.. unable to recieve characters, if
you're to poll the CTS/RTS every so often you could check it easily and
you'd have a non-interrupt driven comm routine, probably end up loosing
characters left & right, but it would work for what you're trying to do
and save some coding. Anyhow this should get you started.
}

[Back to COMM SWAG index]  [Back to Main SWAG index]  [Original]