Duvida ao enviar bloco de comandos para porta serial
Pessoal bom dia,
Estou desenvolvendo uma rotina e preciso enviar uma sequencia de comandos pela porta serial, estou usando o Assync TapdComPort, por exemplo
[b:dc5391c4ba]procedure TForm1.BitBtn1Click(Sender: TObject);
Begin[/b:dc5391c4ba]
[color=blue:dc5391c4ba] InicializaModem.Output := ´AT´^M;
InicializaModem.Output := ´AT´^M;
InicializaModem.Output := ´ATE0´^M;
InicializaModem.Output := ´AT+CPIN?´^M;[/color:dc5391c4ba]
[b:dc5391c4ba]end[/b:dc5391c4ba]
Segue as dúvidas:
1 - O Bloco de comando acima é enviado linha a linha para porta serial ou seja envia a primeira linha processa e depois envia a segunda linha ou é enviado tudo que esta dentro do [b:dc5391c4ba]begin end[/b:dc5391c4ba] para depois processar
2 - Como faço para enviar a sequencia de comandos acima da Forma que só envio a segunda linha de comando após analisar a resposta da primeira.
Conto com a colaboração de todos.
Estou desenvolvendo uma rotina e preciso enviar uma sequencia de comandos pela porta serial, estou usando o Assync TapdComPort, por exemplo
[b:dc5391c4ba]procedure TForm1.BitBtn1Click(Sender: TObject);
Begin[/b:dc5391c4ba]
[color=blue:dc5391c4ba] InicializaModem.Output := ´AT´^M;
InicializaModem.Output := ´AT´^M;
InicializaModem.Output := ´ATE0´^M;
InicializaModem.Output := ´AT+CPIN?´^M;[/color:dc5391c4ba]
[b:dc5391c4ba]end[/b:dc5391c4ba]
Segue as dúvidas:
1 - O Bloco de comando acima é enviado linha a linha para porta serial ou seja envia a primeira linha processa e depois envia a segunda linha ou é enviado tudo que esta dentro do [b:dc5391c4ba]begin end[/b:dc5391c4ba] para depois processar
2 - Como faço para enviar a sequencia de comandos acima da Forma que só envio a segunda linha de comando após analisar a resposta da primeira.
Conto com a colaboração de todos.
Ariovaldo
Curtidas 0
Respostas
Massuda
28/03/2007
O TApdComPort funciona por eventos, de modo que seu programa não fica esperando (bloqueado) uma operação de envio/recepção serial se completar para prosseguir; no seu exemplo, todos os ´blocos´ que você está enviando possivelmente serão transmitidos em uma única operação pelo Windows e isso pode acontecer ´muito´ depois de sua procedure ter terminado.
Nessa situação o que geralmente se faz é implementar uma máquina de estados finitos (MEF). Use o evento de recepção de dados para esperar por uma determinada resposta conforme o estado da MEF; a cada resposta, você muda o estado da MEF e envia um novo comando, até a MEF terminar.
Nessa situação o que geralmente se faz é implementar uma máquina de estados finitos (MEF). Use o evento de recepção de dados para esperar por uma determinada resposta conforme o estado da MEF; a cada resposta, você muda o estado da MEF e envia um novo comando, até a MEF terminar.
GOSTEI 0
Ariovaldo
28/03/2007
Massuda usando um exemplo que vc já me passou no passado eu uso o evento onTriggerAvail para verificar a resposta que esta vindo porém vem tudo de uma vez só as respostas. Poderia me colocar um exemplo bem simples desta maquina de estado?
Valeu até mais
Valeu até mais
GOSTEI 0
Ariovaldo
28/03/2007
Sobe
GOSTEI 0
Massuda
28/03/2007
Vou tentar de um modo mais simples... existe um método de TApdComPort chamado WaitForString......você pode usar essa função depois de mandar cada comando para esperar pela resposta do modem. Por exemplo......para evitar problemas inesperados, use sempre o parâmetro Yield com o valor False; infelizmente, isso pode congelar momentaneamente seu programa.
function TApdComPort.WaitForString( const S : String; const Timeout : LongInt; const Yield, IgnoreCase : Boolean) : Boolean;
procedure TForm1.BitBtn1Click(Sender: TObject); Begin InicializaModem.Output := ´AT´^M; if InicializaModem.WaitForString(´OK´, 1000, False, True) then begin // tudo OK end else begin // timeout ou falhou end; ...
GOSTEI 0