Fórum aguardar o término de uma procedure para continuar o program #349141
17/11/2007
0
Olá pessoal, estou utilizando o componente tcompot para enviar e receber pacotes pela serial do computador. no meu sistema existem várias estações remotas cadastradas no banco de dados. eu tenho que fazer um polling para cada estação remota transmitir seus dados uma a uma estes dados são tratados no meu programa. como faço para somente solicitar dados a próxima estação remota quando os dados da anterior terminarem de ser tratados? Segue um pedaço do código:
ComPort1.Connected:= true;
ComPort1.SetRTS(true);
query1.close;
query1.sql.Clear;
query1.sql.text := ´select End_estacao as Qendereco from Estacao´;
query1.open;
if query1.Eof = true then
ShowMessage(´Não há estações cadastradas´)
else
begin
query1.First;
while not (query1.Eof) do
begin
endereco:= Query1.fieldbyname(´Qendereco´).AsInteger;
tentativas[endereco]:= 0;
transmitePacote(endereco, $ED, $ED);
//o programa só pode executar a próxima instrução (query1.Next;) depois de ter recebido a resposta da estação remota, ou seja, ele tem que ficar parado aqui esperando a resposta e só ir para a próxima instrução depois disso
query1.Next;
end;
end;
o código abaixo é o executado quando chega o pacote na serial:
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
begin
ComPort1.ReadStr(protocolo, count);
if length(protocolo) = 6 then
begin
if (ord(protocolo[1]) = $AA) then
if (ord(protocolo[2]) = $E0) then
begin
if (ord(protocolo[6]) = $55) then
begin
atualizaVariavel(ord(protocolo[5]),
ord(protocolo[3]),
ord(protocolo[4]));
end;
end;
end;
end; \\agora ele deve voltar para o comando query1.Next; da primeira rotina mostrada
Alguém pode me ajudar?
ComPort1.Connected:= true;
ComPort1.SetRTS(true);
query1.close;
query1.sql.Clear;
query1.sql.text := ´select End_estacao as Qendereco from Estacao´;
query1.open;
if query1.Eof = true then
ShowMessage(´Não há estações cadastradas´)
else
begin
query1.First;
while not (query1.Eof) do
begin
endereco:= Query1.fieldbyname(´Qendereco´).AsInteger;
tentativas[endereco]:= 0;
transmitePacote(endereco, $ED, $ED);
//o programa só pode executar a próxima instrução (query1.Next;) depois de ter recebido a resposta da estação remota, ou seja, ele tem que ficar parado aqui esperando a resposta e só ir para a próxima instrução depois disso
query1.Next;
end;
end;
o código abaixo é o executado quando chega o pacote na serial:
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
begin
ComPort1.ReadStr(protocolo, count);
if length(protocolo) = 6 then
begin
if (ord(protocolo[1]) = $AA) then
if (ord(protocolo[2]) = $E0) then
begin
if (ord(protocolo[6]) = $55) then
begin
atualizaVariavel(ord(protocolo[5]),
ord(protocolo[3]),
ord(protocolo[4]));
end;
end;
end;
end; \\agora ele deve voltar para o comando query1.Next; da primeira rotina mostrada
Alguém pode me ajudar?
Ricardoz
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)