Enviar Comandos AT para Modem
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.
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
Curtidas 0
Respostas
Ariovaldo
25/07/2005
Pessoal desculpem, estou usando Delphi 7.0
GOSTEI 0
Ariovaldo
25/07/2005
Sobe
GOSTEI 0
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
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
Obrigado
GOSTEI 0
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
25/07/2005
Massuda Valeu Mesmo problema resolvido.
Obrigado
Obrigado
GOSTEI 0
Ariovaldo
25/07/2005
Massuda e se eu quiser carregar a resposta de um comando em um edit?
Ariovaldo
Ariovaldo
GOSTEI 0
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
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?
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
25/07/2005
ApdComPort1.[color=red:293b6e4cfd]inPut[/color:293b6e4cfd] := ´ATD3305****´;
O correto seria Output... Experimente fazer assim...ApdComPort1.OutPut := ´ATD3305****´ + #1310;
GOSTEI 0
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
Valeu
GOSTEI 0
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
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
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
25/07/2005
Massuda Boa Tarde, puts novamente eu coloquei aquelas Aspas para ver se funcionava mas mesmo assim não funcionou.
Ariovaldo
Ariovaldo
GOSTEI 0
Massuda
25/07/2005
Deveria funcionar comouO que exatamente está acontecendo? O outro modem não está conseguindo conectar? O outro telefone chega a chamar? Não está discando?
ApdComPort1.OutPut := ´ATD33058200´ + #1310;
ApdComPort1.OutPut := ´ATD33058200´^M;
GOSTEI 0
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
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
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).
Se sua discagem for para poder usar o aparelho para falar, o comando a ser enviado é outro (não lembro agora).
GOSTEI 0
Ariovaldo
25/07/2005
Massuda a porta continua aberta.
GOSTEI 0
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
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
Vou tentando por aqui, valeu mesmo
GOSTEI 0
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
Desde já agradeço
GOSTEI 0
Massuda
25/07/2005
Experimente usar este código...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.
ApdComPort1.ComNumber := ...; ApdComPort1.Baud := ...; ApdComPort1.DTR := True; ApdComPort1.RTS := True; ApdComPort1.HWFlowOptions := [hwUseDTR, hwUseRTS]; ApdComPort1.Open := True; ApdComPort1.OutPut := ´ATD33058200´ + 1310;
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
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.
Vou tentar qualquer coisa eu POsto novamente.
GOSTEI 0
Ariovaldo
25/07/2005
Experimente usar este código...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.
ApdComPort1.ComNumber := ...; ApdComPort1.Baud := ...; ApdComPort1.DTR := True; ApdComPort1.RTS := True; ApdComPort1.HWFlowOptions := [hwUseDTR, hwUseRTS]; ApdComPort1.Open := True; ApdComPort1.OutPut := ´ATD33058200´ + 1310;
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
25/07/2005
Ok! Divirta-se com seu brinquedo novo!
GOSTEI 0
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,.
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
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
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
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
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.
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
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
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;
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
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?´.
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
25/07/2005
Massuda estou enviando o #1310 no Final do Comando, agora vou tentar sem os espaços então.
GOSTEI 0
Ariovaldo
25/07/2005
Massuda o Problema era os Espaços entre o comando. Valeu mesmo.
GOSTEI 0
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.
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
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
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
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