Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 17 de Outubro de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
54 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Artigos]  Acessando Modem pelo Delphi
Publicado por Admin : Quinta, Dezembro 19, 2002 - 05:38 GMT-3 (15905 leituras)
Comentários 2 Comentários   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Administrador 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 programas\Arquivos comuns\Borland Shared\MSHelp\guide.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=0M1\N3%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. 

     Victory Fernandes pode ser contactado em victory@e-net.com.br

 



Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.


por: carlos_lopesjr : Nov 27, 2007 - 09:18
(Informações sobre o membro | Enviar uma mensagem)
eu fiz esse aplicativo mas não está funcionando...
não sei se o problema é no meu modem
quando eu disco digito o número do telefone
dá um sinal na caixa de som do meu pc como se o telefone chamado estivesse ocupado...

alguem pode me ajudar?
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados