Buscar

Acessando o modem pelo delphi 7

Código

Acessando Modem pelo Delphi

Atualmente, existem diversas opções de como se realizar ligações a partir de um computador utilizando o modem.  

A mais simples seria fazer com que seu aplicativo chamasse o discador que acompanha o Windows, o que não seria, por assim dizer, uma solução, visto que todas as ligações não seriam realizadas pelo seu aplicativo e futuramente nenhum tipo de relatório poderia ser extraído.

     Uma segunda opção possível seria a utilização da TAPI (Interface de Programação de Aplicativos de Telefonia), que é uma API específica para desenvolvimento de aplicações telefônicas. Apesar desta ser a opção mais recomendada, ela exige muitas linhas de código e uma maior experiência do programador.

     Vamos então nos deter em realizar ligações utilizando os velhos e conhecidos comandos do modem ("modem commands"), acessando, diretamente via um Handle, a porta onde está instalado o modem, e enviando strings de comando para o mesmo, utilizando a função WriteFile.

     Neste artigo utilizamos as funções CreateFile e WriteFile que são descritas ao final. Maiores informações podem ser obtidas no arquivo Microsoft Windows Developers Guide - "C:Arquivos de programasArquivos comunsBorland SharedMSHelpguide.hlp" que acompanha o instalação do Delphi 5.

     Os Comandos do Modem

     Os modems obedecem a tabelas de comandos que podem sofrer variações de acordo com o fabricante. Alguns dos comandos mais usados são:
 
        AT           Atenção   
        A            Atender   
        D            Discar     
        H            Desligar ("Hangup)        
        T            Discagem de TOM    
        P            Discagem de PULSO  
        ,            Pausa     
        &F           Configurações de fábrica   
        <cr>         Terminador 
 
     Esses comandos são combinados de forma a criar a string de comando desejada. Por exemplo, para realizar uma ligação, devemos enviar para o modem a seguinte string:

     ATDT1234567<cr>

     A String acima passa ao modem as seguintes informações:

     AT - Atenção, comandos serão enviados
     D - Discar
     T - Utilizar discagem tipo TOM
     1234567 - Número que se deseja discar
     <cr> - Terminador informando o fim da string

     Criando o programa discador

     Vamos agora criar um pequeno projeto que usa comandos do modem para realizar ligações. Inicie um novo projeto, adicione um TButton, um TEdit, um TComboBox, um TMemo e dois TRadioButton. A Figura 1 mostra o formulário pronto.

     
                      Figura1. Formulário principal do discador

     Na propriedade Itens do ComboBox, adicione os nomes das portas do seu computador (COM1;COM2;COM3;COM4). Logo após a declaração do seu formulário declare as seguintes variáveis globais (mostradas em negrito):
   var
     Form1: TForm1;
     hCommFile: THandle;
     Status: LongBool;
     NumberWritten: DWORD;
     Buf : array [0..1023] of Byte;
     s : string;
     No evento OnClick do botão adicione o seguinte código:
     
     procedure TForm1.Button1Click(Sender: TObject);
     begin  
       //Testa os valores necessários
       if (combobox1.text <> '') and (edit1.text<>'') then
       begin
         //Abre a porta de comunicação
         s:=Combobox1.text;
         hCommFile := CreateFile(PChar(s), GENERIC_WRITE,
         0, // não compartilhado
          nil, // sem segurança
         OPEN_EXISTING,
         FILE_ATTRIBUTE_NORMAL, 0);
         // Verifica a abertura da porta
         if hCommFile = INVALID_HANDLE_VALUE then
         begin
           memo1.lines.clear;
           memo1.lines.add('Não foi possível abrir a porta selecionada.');
           memo1.lines.add('Discagem não efetuada');
           CloseHandle(hCommFile);
         end
         else
         begin
           memo1.lines.clear;
           memo1.lines.add('Discando...');
           //Cria a string de comando
           if radiobutton1.checked then
             s:='ATDT'
           else  
             s:='ATDP';
           s := s + edit1.text + #13#10;
           memo1.lines.add(s);
           //Envia a String de Comando
           NumberWritten:=0;
           Status:= WriteFile( hCommFile,PChar(s)[0],
           Length(s), NumberWritten, nil);
           memo1.lines.add('Aguardando Atendimento ...');
           MessageDlg('Retire o telefone do gancho ' + 'e clique OK para desligar o modem',
             mtInformation,[mbok], 0);
           //Desconecta a ligação
           WriteFile(hCommFile,'ATH',5,NumberWritten,nil);
           //Fecha a porta de comunicação
           CloseHandle(hCommFile);
           memo1.lines.add('Modem Desconectado.'#13#10);
         end;
       end;
     end;

     Pronto, está criado o programa discador, que pode ainda ser incrementado com diversas facilidades, mas que por hora cumpre seu objetivo: realizar ligações!

     As Funções CreateFile e WriteFile

     CreateFile e WriteFile são funções 32-bit da API do Windows para comunicação Síncrona ou Assíncrona com portas seriais e diversos outros dispositivos.

     Veja abaixo a sintaxe das funções e alguns dos seu principais parâmetros:

     A Função CreateFile
     Cria e abre um arquivo ou acesso a porta, retornando um operador (Handle) por onde serão realizadas as operações desejadas.

     HANDLE CreateFile(LPCTSTR lpFileName, // Ponteiro para o Nome do Arquivo
     DWORD dwDesiredAccess, // Tipo de Acesso
     DWORD dwShareMode, // Tipo de Compartilhamento
     LPSECURITY_ATTRIBUTES lpSecurityAttributes, // Atributos de Segurança
     DWORD dwCreationDistribution, // Forma de criação do objeto
     DWORD dwFlagsAndAttributes, // Atributos do Arquivo
     HANDLE hTemplateFile // Operador para o arquivo
     );

     - Principais Parâmetros:

     lpFileName
     Especifica o tipo de objeto para Criar ou Abrir, alguns objetos possíveis são:

     - Arquivos
     - Programas Console
     - Portas Seriais
     dwDesiredAccess

     Especifica o tipo de acesso ao objeto que podem ser: Acesso de Leitura, Escrita e Leitura-Escrita.

     A Função WriteFile
     Utiliza o operador retornado pela função CreateFile para escrever no arquivo ou porta recém criada e aberta.

     BOOL WriteFile( HANDLE hFile, // Operador para o objeto
     LPCVOID lpBuffer, // Ponteiro para os dados a escrever
     DWORD nNumberOfBytesToWrite, // Número de bytes para escrever
     LPDWORD lpNumberOfBytesWritten, // Ponteiro para número de bytes escritos
     LPOVERLAPPED lpOverlapped // Ponteiro para estrutura I/O
     );

     - Principais Parâmetros:
     hFile
     Operador retornado pela função CreateFile através do qual é possível se realizar as operações desejadas.

     lpBuffer
     Ponteiro indicando o buffer que contém os dados a serem escritos.

     Notas finais

     • Para saber em que porta o seu modem está instalado consulte as propriedades do seu modem no painel de controle do Windows

     • Realizando testes, percebi que alguns modems tais como o HSP56 Micro Modem não realizam a ligações com a função mostrada anteriormente, isso porque, por default, a opção "
Aguardar sinal antes de discar" não está selecionada. Para selecioná-la, envie para o modem a seguinte string de comando, antes da string com o número a ser discado.

     s:='ATS7=60S30=0M1N3%C3&K3B0N1X1'+#13#10;

     • Caso possua uma central telefônica entre a linha e o PC, na maioria das vezes é necessário enviar o número para requisitar a linha externa e uma pausa. Isso altera um pouco a string de comando:

     S:='ATDT0, 1234567'+#13#10;

     • Este artigo foi testado para os modems HSP56 Micro Modem, Genius GM56PCI-L Modem Card, USRobotics 33 e 56, e não deve apresentar defeitos para outros modems diversos.

     Diogo José Lugli Rampazzo,

diogo.rampazzo@itelefonica.com.br

Publicidade

Vote na dica




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes da dica

Categoria: Object pascal
Adicionada dia: 20/12/06
Por: Diogo José Lugli Rampazzo
Visualizada: 7301 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009