GARANTIR DESCONTO

Fórum Porta Serial Lenta #356156

28/03/2008

0

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á.


Rudá

Rudá

Responder

Posts

28/03/2008

Edilcimar

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


Responder

Gostei + 0

29/03/2008

Rudá

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.


Responder

Gostei + 0

29/03/2008

Kroki

Da pra vc postar a rotina de envio?Pois não tem segredo,assim poderemos compilar aqui e testar.


Responder

Gostei + 0

29/03/2008

Rudá

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;



Responder

Gostei + 0

29/03/2008

Kroki

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



Responder

Gostei + 0

31/03/2008

Rodc

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.
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?


Responder

Gostei + 0

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

Aceitar