GARANTIR DESCONTO

Fórum Duvida ao enviar bloco de comandos para porta serial #339431

28/03/2007

0

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.


Ariovaldo

Ariovaldo

Responder

Posts

28/03/2007

Massuda

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.


Responder

Gostei + 0

28/03/2007

Ariovaldo

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


Responder

Gostei + 0

28/03/2007

Ariovaldo

Sobe


Responder

Gostei + 0

29/03/2007

Massuda

Vou tentar de um modo mais simples... existe um método de TApdComPort chamado WaitForString...
function TApdComPort.WaitForString(
  const S : String;
  const Timeout : LongInt;
  const Yield, IgnoreCase : Boolean) : Boolean;
...você pode usar essa função depois de mandar cada comando para esperar pela resposta do modem. Por exemplo...
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;
...
...para evitar problemas inesperados, use sempre o parâmetro Yield com o valor False; infelizmente, isso pode congelar momentaneamente seu programa.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar