Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 52. - Vytočení telefonního čísla; Stav modemu

Jan Šindelář - 7.8.2002

Vytočení telefonního čísla

Máte-li modem, můžete si vyzkoušet následující příklad. Ukážeme si, jak prostřednictvím modemu a jeho AT příkazů vytočit libovolné telefonní číslo a samozřejmě také jak spojení ukončit. Musíte samozřejmě toto číslo specifikovat v programu a dále je též nutné v programu určit, na jakém portu máte modem, protože v tak kratičkém příkladu pochopitelně není autodetekce. Samotný kód je jako obvykle "přilepen" na událost stisku tlačítka, přesněji řečeno dvou tlačítek. První tlačítko se pokusí vytočit číslo a navázat spojení. Nejprve zkusí otevřít příslušný COM port, poté se pokusí vytočit číslo a pokud vše proběhne v pořádku, spojení je navázáno. Druhé tlačítko slouží k ukončení "hovoru".

.
.
.
var
  hCommFile : THandle;
.
.
.

procedure TForm1.Button1Click(Sender: TObject);
var
  PhoneNumber : string;
  CommPort : string;
  nw : Cardinal;
begin
  PhoneNumber := `ATDT 0603123456` + #13 + #10;
  CommPort := `COM3`;
  hCommFile := CreateFile(PChar(CommPort), GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if hCommFile=INVALID_HANDLE_VALUE then
  begin
  ShowMessage(`Nelze otevřít `+ CommPort);
  exit;
  end;
  nw := 0;
  if  not WriteFile(hCommFile, PChar(PhoneNumber)^, Length(PhoneNumber), nw, nil) then ShowMessage(`Nelze komunikovat přes ` + CommPort);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
CloseHandle(hCommFile);
end;

Telefonní číslo v naší ukázce následuje v příslušné proměnné za znaky ATDT a pro názornost je použito smyšlené mobilní číslo. Pro lepší použitelnost by bylo pochopitelně lepší umožnit zadávání čísla například přes Edit. Totéž se týká COM portu.

Stav modemu

I druhý dnešní tip souvisí s modemem. Tentokrát si ukážeme, jak zjistit některé jeho stavové informace. Opět je třeba specifikovat COM port a celá struktura procedury je dost podobná předchozímu příkladu. Výsledný stav je poté vypsán v jednoduchém dialogu.

procedure TForm1.Button1Click(Sender: TObject);
var
CommPort : string;
hCommFile : THandle;
ModemStat : DWord;
begin
CommPort := `COM3`;
hCommFile := CreateFile(PChar(CommPort), GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if hCommFile = INVALID_HANDLE_VALUE then
begin
  ShowMessage(`Nelze otevřít `+ CommPort);
  exit;
end;

if GetCommModemStatus(hCommFile, ModemStat) then
begin
  if ModemStat and MS_CTS_ON <> 0 then ShowMessage(`The CTS (clear-to-send) is on.`);
  if ModemStat and MS_DSR_ON <> 0 then ShowMessage(`The DSR (data-set-ready) is on.`);
  if ModemStat and MS_RING_ON <> 0 then ShowMessage(`The ring indicator is on.`);
  if ModemStat and MS_RLSD_ON <> 0 then ShowMessage(`The RLSD (receive-line-signal-detect) is on.`);
end;

CloseHandle(hCommFile);
end;

Zjištění stavu modemu nějaký čas zabere (u mě okolo dvou sekund), takže nepanikařte, pokud se výsledek nezobrazí ihned. Text (tedy stav), který se zobrazí jako výsledek, jsem tentokrát nepřekládal, protože by to mohlo být spíše kontraproduktivní a věřím že ti, kteří tento tip budou zkoušet, ví o co jde a dají přednost původním termínům.