Enviar Comandos AT para Modem

Delphi

25/07/2005

Pessoal Bom Dia, preciso desenvolver uma pequena Aplicação que faça o seguinte:
Tenho um Modem Externo, preciso enviar dois comandos AT para ele para gravar um dados em sua memória, já testei isso no Hyper Terminal e Funciona beleza, procurei no Forum algo sobre Comando AT e HYper Terminal mas a unica coisa que achei foi um componente TurboPower Async Professional 4.06 released porem não consegui usa-lo, se alguém puder me ajudar eu agradeço.


Ariovaldo

Ariovaldo

Curtidas 0

Respostas

Ariovaldo

Ariovaldo

25/07/2005

Pessoal desculpem, estou usando Delphi 7.0


GOSTEI 0
Ariovaldo

Ariovaldo

25/07/2005

Sobe


GOSTEI 0
Massuda

Massuda

25/07/2005

Deve funcionar usando qualquer biblioteca de componentes que permita acesso à porta serial. Algumas bibliotecas freeware com fontes para comunicação serial:[list:97a5e27cb6][*:97a5e27cb6][url=http://sourceforge.net/projects/tpapro/]AsyncPro[/url]: uma das melhores bibliotecas para comunicação serial[*:97a5e27cb6][url=http://sourceforge.net/projects/comport/]ComPort[/url]: uma biblioteca freeware muito popular[*:97a5e27cb6][url=http://www.ararat.cz/synapse/]SynaSer[/url]: biblioteca de classes para comunicação serial[/list:u:97a5e27cb6]Por exemplo, usando o TApdComPort da AsyncPro (que você está usando):
// assume que o modem está ligado na COM1
ApdComPort1.ComNumber := 1;
ApdComPort1.Baud := 9600;
ApdComPort1.Parity := pNone;
ApdComPort1.DataBits := 8;
ApdComPort1.StopBits := 1;

ApdComPort1.Open := True;

// resseta o modem
ApdComPort1.OutPut := ´ATZ´^M;
// ...ou use .PutString(´ATZ´^M);

ApdComPort1.Open := False;



GOSTEI 0
Ariovaldo

Ariovaldo

25/07/2005

Massuda Obrigado pela Ajuda, Preciso também enviar um comandos AT para o Modem que vai estar em um Edit que comando posso usar?

Obrigado


GOSTEI 0
Massuda

Massuda

25/07/2005

...enviar um comandos AT para o Modem que vai estar em um Edit...
Seria algo assim...
ApdComPort1.Open := True; 

ApdComPort1.OutPut := Edit1.Text; 
// ...ou ApdComPort1.PutString(Edit1.Text); 

ApdComPort1.Open := False;



GOSTEI 0
Ariovaldo

Ariovaldo

25/07/2005

Massuda Valeu Mesmo problema resolvido.

Obrigado


GOSTEI 0
Ariovaldo

Ariovaldo

25/07/2005

Massuda e se eu quiser carregar a resposta de um comando em um edit?

Ariovaldo


GOSTEI 0
Massuda

Massuda

25/07/2005

...se eu quiser carregar a resposta de um comando em um edit?
No evento OnTriggerAvail do TApdComPort faça algo assim:
procedure TSeuForm.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var
  Porta: TApdComPort;
  S: string;
  I: Word;
begin
  Porta := CP as TApdComPort;

  S := ´´;
  for I := 1 to Count do begin
    C := Porta.GetChar;
    if not (C in [0..31]) then begin
      S := S + C;
    end;
  end;
  
  Edit1.Text := S;
end;



GOSTEI 0
Ariovaldo

Ariovaldo

25/07/2005

Pessoal Baseado nas Dicas que já me deram neste Tópico cheguei neste exemplo

procedure TForm1.Button1Click(Sender: TObject);
begin
ApdComPort1.ComNumber := 1;
ApdComPort1.Baud := 9600;
ApdComPort1.Parity := pNone;
ApdComPort1.DataBits := 8;
ApdComPort1.StopBits := 1;

ApdComPort1.Open := True;

ApdComPort1.inPut := ´ATD3305****´;
End;

Conforme o exemplo ao clicar no Button1 o Modem deveria chamar o número informado no comando ATD e não chama porém no Hyper terminal ele chama

O que poderá estar errado?


GOSTEI 0
Massuda

Massuda

25/07/2005

ApdComPort1.[color=red:293b6e4cfd]inPut[/color:293b6e4cfd] := ´ATD3305****´;
O correto seria Output... Experimente fazer assim...
ApdComPort1.OutPut := ´ATD3305****´ + #1310;
...porque mesmo no Hyperterminal você tem que dar um Enter (equivale ao 1310) para o modem discar.


GOSTEI 0
Ariovaldo

Ariovaldo

25/07/2005

Massuda desculpa o INPUT que esta lá foi eu que coloquei num momento de ´apelação´ mas na verdade esta como vc falou OUTPUT O comando ENTER sim eu não estou enviando.

Valeu


GOSTEI 0
Ariovaldo

Ariovaldo

25/07/2005

Pessoal ainda não consegui solucionar o problema, estou com o seguinte bloco de Comando:

ApdComPort1.ComNumber := 2;
ApdComPort1.Baud := 57600;
ApdComPort1.Parity := pNone;
ApdComPort1.DataBits := 8;
ApdComPort1.StopBits := 1;

If ApdComPort1.Open Then
ApdComPort1.Open := False;

ApdComPort1.Open := True;

ApdComPort1.OutPut := ´ATD33058200´ + ´#1310´;

Um detalhe que não passei é o seguinte:
estou usando um Modem externo com um Chip de Celular não é um modem interno e Discado, porém o Detalhe é que no Hyper Terminal Funciona.

Abraços


GOSTEI 0
Massuda

Massuda

25/07/2005

ApdComPort1.OutPut := ´ATD33058200´ + [color=red:cf74f3d051]´#1310´[/color:cf74f3d051];
O 1310 não vai entre aspas... do jeito que você escreveu, está enviando literalmente ´1310´ para o modem (que não entende o que é) ao invés de enviar CR/LF. Portanto, fica assim:
ApdComPort1.OutPut := ´ATD33058200´ + 1310;



GOSTEI 0
Ariovaldo

Ariovaldo

25/07/2005

Massuda Boa Tarde, puts novamente eu coloquei aquelas Aspas para ver se funcionava mas mesmo assim não funcionou.

Ariovaldo


GOSTEI 0
Massuda

Massuda

25/07/2005

Deveria funcionar com
ApdComPort1.OutPut := ´ATD33058200´ + #1310;
ou
ApdComPort1.OutPut := ´ATD33058200´^M;
O que exatamente está acontecendo? O outro modem não está conseguindo conectar? O outro telefone chega a chamar? Não está discando?


GOSTEI 0
Ariovaldo

Ariovaldo

25/07/2005

Ocorre o seguinte:
Tenho um Modem Externo que funciona Via Celular, Acontece que via Hyper Terminal se eu passar o Comando ATD33058200 ele disca Normalmente para um telefone fixo, porem se eu passo o mesmo comando via Aplicação Delphi ele não disca.

Ariovaldo


GOSTEI 0
Massuda

Massuda

25/07/2005

Você está fechando a porta serial imediatamente após enviar o comando? Se estiver fazendo isso tem chance do modem nem ter recebido o comando. Espere pela resposta do modem (não lembro agora exatamente qual seria a resposta).

Se sua discagem for para poder usar o aparelho para falar, o comando a ser enviado é outro (não lembro agora).


GOSTEI 0
Ariovaldo

Ariovaldo

25/07/2005

Massuda a porta continua aberta.


GOSTEI 0
Massuda

Massuda

25/07/2005

Notei que do início do tópico até agora, você mudou de porta serial (de COM1 para COM2) e mudou a velocidade (de 9600 para 57600 bps). Desculpe, mas você está com o telefone conectado na porta serial COM2 ou COM1? Fora isso, esgotaram as minhas idéias...


GOSTEI 0
Ariovaldo

Ariovaldo

25/07/2005

Massuda realmente já mudei as duas configurações más é como já disse eu tenho um Modem externo ligado na porta serial abro o Hyper terminal e consigo fazer a comunicação normalmente configurando a porta para COM 1 e velocidade 57600 funciona normalmente fecho o Hyper terminal e executo a aplicação via Delphi na mesma porta e Velocidade e não Funciona.
Vou tentando por aqui, valeu mesmo


GOSTEI 0
Ariovaldo

Ariovaldo

25/07/2005

Pessoal ainda não consegui efetuar a discagem para este modem será que para Modem externo que usa Celular e não linha convencional a forma de enviar comando AT é outra? sei que os comandos são os mesmo pois via Hyper Terminal funciona normalmente, caso alguém saiba de alguma coisa por favor poste uma resposta aqui.
Desde já agradeço


GOSTEI 0
Massuda

Massuda

25/07/2005

Experimente usar este código...
ApdComPort1.ComNumber := ...; 
ApdComPort1.Baud := ...; 

ApdComPort1.DTR := True;
ApdComPort1.RTS := True;
ApdComPort1.HWFlowOptions := [hwUseDTR, hwUseRTS];

ApdComPort1.Open := True; 

ApdComPort1.OutPut := ´ATD33058200´ + 1310;
O código adicional ativa controle de fluxo (handshake) por hardware.

Finalmente, fiquei com a impressão de que você está tentando fazer a discagem para usar internet; avise se for isso, pois este não é o modo a ser usado para fazer uma conexão via internet.


GOSTEI 0
Ariovaldo

Ariovaldo

25/07/2005

Olá Massuda, Na verdade não é para acesso a internet, temos uma solução que a comunicação é via GPRS portanto usamos os Chip da Claro e TIM agora preciso gravar o sim card dentro do CHIp pois o Fornecedor não manda gravado e preciso desenvolver algo mais rápido pois pelo Hyper terminal é muito lento.

Vou tentar qualquer coisa eu POsto novamente.


GOSTEI 0
Ariovaldo

Ariovaldo

25/07/2005

Experimente usar este código...
ApdComPort1.ComNumber := ...; 
ApdComPort1.Baud := ...; 

ApdComPort1.DTR := True;
ApdComPort1.RTS := True;
ApdComPort1.HWFlowOptions := [hwUseDTR, hwUseRTS];

ApdComPort1.Open := True; 

ApdComPort1.OutPut := ´ATD33058200´ + 1310;
O código adicional ativa controle de fluxo (handshake) por hardware. Finalmente, fiquei com a impressão de que você está tentando fazer a discagem para usar internet; avise se for isso, pois este não é o modo a ser usado para fazer uma conexão via internet.


Massuda problema resolvido agora a unica alteração que fiz foi altera a Linha abaixo más isso porque estava escrito errado e não compilava
[b:bb5c9d6cb7]ApdComPort1.HWFlowOptions := [hwUseDTR, hwUseRTS];[/b:bb5c9d6cb7]
coloquei apenas um F que estava faltando e ficou assim
ApdComPort1.HWFlowOptions := [hwfUseDTR, hwfUseRTS];


GOSTEI 0
Massuda

Massuda

25/07/2005

Ok! Divirta-se com seu brinquedo novo!


GOSTEI 0
Ariovaldo

Ariovaldo

25/07/2005

Pessoal tá dificil finalizar isso, mas estou bem próximo, preciso enviar dois comandos AT para o Modem da seguinte forma:
AT + MCSN=0,1,.......... Para gravar um determinado dado no Chip até ai OK

Agora preciso dar um comando AT+CNUM? para saber o que foi Gravado no Chip como faço para atribuir o resultado deste comando em uma variável?

estou usando a rotina abaixo porem não esta me retornando o resultado que eu quero,.


GOSTEI 0
Ariovaldo

Ariovaldo

25/07/2005

Foi mal pessoal não passei a Rotina que estou usando

procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var
Porta: TApdComPort;
S: string;
C: Char;
I: Word;
begin
Porta := CP as TApdComPort;

S := ´´;
for I := 1 to Count do begin
C := Porta.GetChar;
if not (C in [#0..31]) then begin
S := S + C;
end;
end;

Edit3.Text := S;
end;

Na verdade esta rotina me retorna a String de comando que eu passei na ultima vez para a porta


GOSTEI 0
Massuda

Massuda

25/07/2005

Na verdade esta rotina me retorna a String de comando que eu passei na ultima vez para a porta
O default dos modems é ecoar (mandar de volta) todos os comandos que recebe mais o texto OK ou ERR para indicar o resultado da operação.


GOSTEI 0
Ariovaldo

Ariovaldo

25/07/2005

Massuda acho que não consegui explicar direito mas agora a dificuldade é a seguinte:
eu envio o seguinte Comando para o Modem:[b:61942ae35e]´AT+MCSN=0,1,´ + ´´´ + EdtTelefone.Text + ´´´; [/b:61942ae35e] ou seja este comando me grava dentro do Chip Celular o conteudo que esta no EDTTelefone.text, Agora eu preciso enviar um comando para o Modem para saber o que foi gravado ou seja quero checar se esta correto o que foi gravado então quero dar o seguinte comando [b:61942ae35e]AT+CNUM?[/b:61942ae35e] e colocar isso dentro de um edit.


GOSTEI 0
Massuda

Massuda

25/07/2005

O jeito de pegar uma resposta do modem é como mostrei no meu terceiro post neste tópico, usando o evento TApdComPort.OnTriggerAvail. Infelizmente não tem um jeito fácil de pegar a resposta do modem; use uma flag/variável de controle para saber quando pegar a resposta da consulta que você está enviando ao telefone.


GOSTEI 0
Ariovaldo

Ariovaldo

25/07/2005

Massuda o estranho é que eu envio um comando AT + CNUM? por exemplo e no evento abaixo a Variável S armazena o Conteúdo AT + CNUM? sinceramente não estou entendendo, no Hyper Terminal se eu der este comando ele me retorna algo do tipo 1198765676 (Situação Atual)

procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var
Porta: TApdComPort;
S: string;
C: Char;
I: Word;
begin
Porta := CP as TApdComPort;

S := ´´;
for I := 1 to Count do begin
C := Porta.GetChar;
if not (C in [#0..31]) then begin
S := S + C;
end;
end;

Edit3.Text := S;
end;


GOSTEI 0
Massuda

Massuda

25/07/2005

(Desculpe por perguntar) Está incluindo o #1310 (ou ^M) na string enviada ao aparelho?

O que você está recebendo como resposta?

Que eu me lembre, os comandos AT não permitem (ou não usam) espaços em branco. Por exemplo, acho que o correto seria ´AT+CNUM?´ ao invés de ´AT + CNUM?´.


GOSTEI 0
Ariovaldo

Ariovaldo

25/07/2005

Massuda estou enviando o #1310 no Final do Comando, agora vou tentar sem os espaços então.


GOSTEI 0
Ariovaldo

Ariovaldo

25/07/2005

Massuda o Problema era os Espaços entre o comando. Valeu mesmo.


GOSTEI 0
Iluvatar

Iluvatar

25/07/2005

Pessoal,

ja faz um tempo que venho acompanhando este topico e tb implementando os exemplos.

mas agora estou com a seguinte situacao:

- consigo fazer a chamada para um linha de fone;

mas gostaria, por exemplo, de poder enviar uma sequencia de caracteres para o modem que atendeu para fazer algumas coisas e responder um resultado.

um exemplo: o cliente digita um codigo para verificacao, ao clicar em um botao eh feita a chamada para o meu modem , que atende, recebendo o codigo digitado pelo cliente. Eu verifico alguma coisa e retorno um valor para a chamada.

Alguem poderia dar uma ajuda nisso ? Obrigado desde ja.


GOSTEI 0
Massuda

Massuda

25/07/2005

...poder enviar uma sequencia de caracteres para o modem que atendeu para fazer algumas coisas e responder um resultado.....
O esquema de enviar/receber é o que descrevi nos meus posts neste tópico.

O que você precisa implementar é um mecanismo de controle do processo de comunicação, basicamente uma máquina de estado finito que representa o processo de comunicação, de modo que o envio e (principalmente) a recepção funcione de acordo com o estágio do processo de comunicação.


GOSTEI 0
Dpinho

Dpinho

25/07/2005

Desculpe ressucitar este topico
Tenho duas portas em meu micro ligadas por um cabo confecionado para o simulador da impressora fiscal, estou tentando testar minha rotina para inteligar a Balança Eletronica a meu pdv. como não tenho uma balança preciso criar um forma de enviar por uma porta uma variavel e receber em meu pdv como se fosse um simulador, mas não estou conseguindo fazer.
alguem tem alguma forma de fazer isto.

Estou utilizando uma rotina em espanhol para esperar o peso, mas não consingo enviar na porta com1 uma variavel.

Tambem preciso de um demo de como capturar uma chamada telefonica atraves do fax modem


GOSTEI 0
POSTAR