Bem vindo ao LifeGames Demo
Cadastre-se agora para ter acesso a todos os nossos recursos. Uma vez cadastrado e logado, você será capaz de criar tópicos, postar respostas a tópicos já existentes, a reputação de seus companheiros, começar seu próprio mensageiro privado, atualizações de status post, gerir o seu perfil e muito mais. Esta mensagem será removida assim que tiver logado.
Entrar Cadastre-se


Você não está conectado. Conecte-se ou registre-se

Ver o tópico anterior Ver o tópico seguinte Ir em baixo  Mensagem [Página 1 de 1]

1 Acessando Modem pelo Delphi em Sex Fev 15, 2013 8:36 am

Moedas Moedas : 278
Mensagens Mensagens : 1177
Idade Idade : 19
Humor Humor : Forever Alone T.T
Reputação Reputação : 28
Quebra de regras:
0 / 1000 / 100

RodrigoNunes

Admin

Admin



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

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
- 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):
Código:
  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:

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.

Código:
  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:

Código:
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.

Código:
    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:
Código:
  hFile
Operador retornado pela função CreateFile através do qual é possível se realizar as operações desejadas.

Código:
    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.

Código:
 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:

Código:
  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.


Credit's: Diogo José Lugli Rampazzo




[Você precisa estar registrado e conectado para ver esta imagem.]
O Administrador ℛodrigoNunes sugere:
- Respeite as [Você precisa estar registrado e conectado para ver este link.]
- Participe das nossas [Você precisa estar registrado e conectado para ver este link.]
- Veja a nosso [Você precisa estar registrado e conectado para ver este link.]
- Não peça suporte por MP


Try
Topic.Resolve;
Finally
Topic.Caption := Topic.Caption + '[RESOLVIDO]';
Spoiler:
[Você precisa estar registrado e conectado para ver esta imagem.]
Ver perfil do usuário https://www.facebook.com/DarkGamesBrasil formatacaodemicros@hotmail.com.br naotenho esqueci

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo  Mensagem [Página 1 de 1]

Permissão deste fórum:
Você não pode responder aos tópicos neste fórum