Porta Serial Lenta
Estou tendo problemas com a porta serial.
Eu tenho que enviar +- 20 comandos por segundo e o componente não ta ta suportando essa demanda, desses 20 só envia 10 +-.
Já tentei vários componentes de porta.
Mas nenhum funciona rápido o suficiente.
Eu verifiquei usando um programa proprio da empresa do hardware para testar e no programa deles envia mais de 20 tranquilamente.
O que pode está acontecendo?
Obrigado desde já.
Eu tenho que enviar +- 20 comandos por segundo e o componente não ta ta suportando essa demanda, desses 20 só envia 10 +-.
Já tentei vários componentes de porta.
Mas nenhum funciona rápido o suficiente.
Eu verifiquei usando um programa proprio da empresa do hardware para testar e no programa deles envia mais de 20 tranquilamente.
O que pode está acontecendo?
Obrigado desde já.
Rudá
Curtidas 0
Respostas
Edilcimar
28/03/2008
você está falando de uma forma genérica, poderia ser mais específica neste tipo de informação, de repente o erro pode ser do:
a) computador
b) da forma como acessa o processo
c) da forma como envia o processo
d) da forma como desenvolveu o processo
e) outras
a) computador
b) da forma como acessa o processo
c) da forma como envia o processo
d) da forma como desenvolveu o processo
e) outras
GOSTEI 0
Rudá
28/03/2008
Descupe, acho que não falei o mais importante.
Acho que não seja o computador já que o próprio programa da Empresa funciona.
Então acho que seja como eu estou fazendo como faço para acessar.
Estou usando atualmente o Componente TSerialPort.
Eu me conecto a porta serial com essas configuracoes:
Envio usando o comando o Componente.
Então criei uma Theard.
Quando dou o Create ele inicia e espera a Section liberar quando liberar ele envia e espera 50ms ai a outra Theard que foi criada envia e espera mais 50ms e com isso a cada 50ms envia um comando para a porta serial formando 20 comandos em 1 segundo.
Já tentei colocar 10 comandos em um segundo e nada de ele enviar tudo.
Acho que não seja o computador já que o próprio programa da Empresa funciona.
Então acho que seja como eu estou fazendo como faço para acessar.
Estou usando atualmente o Componente TSerialPort.
Eu me conecto a porta serial com essas configuracoes:
Envio usando o comando o Componente.
Então criei uma Theard.
Quando dou o Create ele inicia e espera a Section liberar quando liberar ele envia e espera 50ms ai a outra Theard que foi criada envia e espera mais 50ms e com isso a cada 50ms envia um comando para a porta serial formando 20 comandos em 1 segundo.
Já tentei colocar 10 comandos em um segundo e nada de ele enviar tudo.
GOSTEI 0
Kroki
28/03/2008
Da pra vc postar a rotina de envio?Pois não tem segredo,assim poderemos compilar aqui e testar.
GOSTEI 0
Rudá
28/03/2008
Certo eu criei essa variável global:
TEnviarThread = class(TThread)
private
FDado: String;
protected
procedure Execute(); override;
public
constructor Create(Dado: String);
end;
var
Form1: TForm1;
EnviarThreadSection: TCriticalSection;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
EnviarThreadSection:= TCriticalSection.Create;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i:= 1 to 20 do
TEnviarThread.Create(´Comando ´+IntToStr(i));
end;
constructor TEnviarThread.Create(Dado: String);
begin
inherited Create(False);
Priority:= tpNormal;
FreeOnTerminate:= True;
FDado:= Dado;
end;
procedure TEnviarThread.Execute();
begin
EnviarThreadSection.Enter;
Form1.PortaSerial.SendString(Dado);
Sleep(50);
EnviarThreadSection.Leave;
end;GOSTEI 0
Kroki
28/03/2008
Olá,não vou testar hoje mas experimenta colocar ´Application.ProcessMessages; ´
procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i:= 1 to 20 do TEnviarThread.Create(´Comando ´+IntToStr(i)); Application.ProcessMessages; end
GOSTEI 0
Rodc
28/03/2008
Se você fizer Sleep(1) ele vai ficar 1ms parado, porém ele vai gastar mais tempo processando as rotinas do Sistema operacional que avisa após 1ms que a pausa terminou do que a pausa em sí.
Em C++ eu uso o código abaixo quando preciso pausar 50ms sem perder muito tempo, como o Sleep() faz.
Não sei no Delphi qual a função que retorna o tempo atual, nem sei se existe o tipo clock_t. Mas boa pesquisa.
Outra questão: você não pode reduzir o tempo de 50ms para um tempo que faça os 20 comandos serem enviados em um segundo?
Em C++ eu uso o código abaixo quando preciso pausar 50ms sem perder muito tempo, como o Sleep() faz.
clock_t begin;// Declaração da variável do tipo clock_t begin = clock(); // begin recebe o clock atual (valor em ms) while (clock() - begin < 50);// fica em loop enquando não passar 50ms
Não sei no Delphi qual a função que retorna o tempo atual, nem sei se existe o tipo clock_t. Mas boa pesquisa.
Outra questão: você não pode reduzir o tempo de 50ms para um tempo que faça os 20 comandos serem enviados em um segundo?
GOSTEI 0