[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]