Página 1 de 1

Synaser nao recebe bytes pq?

MensagemEnviado: 14 Mai 2008 13:21
por Wagner de Queiroz
Boa tarde pessoal estou usando o Synaser em minha aplicacao Delphi e estou tentando tirar leite de pedra com ele.

Eu estou usando o Turbo Delphi Explorer (Que nao deixa instalar componentes) e preciso trocar comandos com um dispositivo tosco.


O meu problema é que o delphi nao esta apresentando os dados lidos da serial.
Esta linha aqui nao esta retornando nenhum dado.
Código: Selecionar todos
ser.Recvstring(1000);


Isso esta me frustrando seriamente.

Num monitor serial vejo o trafego de ida e de volta. o Dispositivo recebe o dado e responde, mas o delphi nao esta apresentando os dados.

Veja abaixo o código que estou usando:

Código: Selecionar todos
procedure TForm1.Button1Click(Sender: TObject);
begin
    ser:=TBlockSerial.Create;
    ser.RaiseExcept:=True;
  try
    ser.AtTimeout:=500;
    ser.Connect(Edit1.Text);

    ser.Config(StrToIntDef(Edit1.Text, 9600),8,'N',1,false,false);
     memo1.lines.text:=ser.ATCommand(Edit2.Text);
     Memo1.Lines.add(TimeToStr(now)+' Recebido: '+ser.Recvstring(1000));
     Ser.SendString('CMD01');
      Memo1.Lines.add(TimeToStr(now)+' Recebido: '+ser.Recvstring(1000));
  finally
    ser.free;
  end;
end;



Alguem tem alguma ideia para que eu consiga fazer o delphi mostrar os dados que estao chegando? É tudo string para facilitar

Re: Synaser nao recebe bytes pq?

MensagemEnviado: 14 Mai 2008 15:57
por Jorge_Francisco
Não sei se é isso, mas pode tentar:

if ser.canread(1000) then begin
temp := ser.Recvstring(1000);

E concatena depois. Não sei, porque uso componentes no delphi e ele não é o meu forte.

Abraço

Re: Synaser nao recebe bytes pq?

MensagemEnviado: 14 Mai 2008 16:01
por Jorge_Francisco
Assim :

Código: Selecionar todos

uses
  synaser,
  sysutils;

var
   ser:TBlockSerial;
   LCMD:String;
 begin
   ser:=TBlockserial.Create;
   try
     ser.RaiseExcept:=true;
     ser.Connect('COM1');
     ser.Config(9600,8,'N',0,false,false);

     while not (ser.LastError <> 0) do begin
            if ser.lastError<>0 then break;
              if ser.canread(1000) then  begin
              LCMD := ser.Recvstring(1000);
              writeLn(LCMD);
              end;

     end;

   finally
     ser.Free;
   end;
 end.


MensagemEnviado: 14 Mai 2008 16:32
por Wagner de Queiroz
para quem for se aventurar como eu no synaser e tiver tendo o erro 9997 remova esta linha do exemplo acima:

Código: Selecionar todos
 ser.RaiseExcept:=true;


Esta linha enche o saco.

Este exemplo eu ja usei da internet e nao funciona tb. Ele nao recebe resposta.

Agora a sua dica abaxo:

Código: Selecionar todos
if ser.canread(1000) then begin
temp := ser.Recvstring(1000);


nao deu muito certo nao. Vou testar mais para ver.

MensagemEnviado: 22 Mai 2008 22:45
por Wagner de Queiroz
Pessoal, continuo tirando leite de pedra do Synaser. Componentezinho fila da mãe.

Eu coloquei um timer de 1ms para ver se tem dados para receber e alimentar um memo. o problema é que costumo perder em algumas ocasioes entre 4 até 13 bytes.


Código: Selecionar todos
procedure TForm1.Timer1Timer(Sender: TObject);
var
Buffer:Integer;

begin
Timer1.Enabled:=False;
if Ser.WaitingDataEx>0 then
  begin
     Buffer:=ser.WaitingData;

    if Buffer>0 then
    memo1.Text:=Memo1.Text+( ser.RecvPacket(1) );
  end;
  Timer1.Enabled:=True;
end;


será que eu teria mais sorte com um thread ? ou estou fazendo tudo errado?

MensagemEnviado: 07 Jun 2008 23:26
por RobL
Wagner: Agora tens que conseguir.
Depois de horas conseguí transmitir e receber sem erro:

Nota: No seu código em ser.Config você setou para 1,5 stop bit. Para 1 stop bit deve usar zero, conforme abaixo.
Como recebí byte, através de uma variável string, para ver o que vinha tive que fazer virar ASCII.

Se tiver ainda assim não conseguir, use a função entre {} para byte.
E trate o primeiro byte recebido. No meu caso, transmití o byte 0x1 e transformei em ASCII. Funcionou. Foi esse o primeiro sucesso, com apenas um byte!!!

ser:=TBlockserial.Create;
try
// ser.RaiseExcept:=True; // realmente aqui se usar precisa tratar cada caso.
ser.Connect('COM1');
ser.Config(9600,8,'N',0,false,false);
Ser.SendString(RelStr);
// sleep (300); // já tem isso na função (timeout)
DatEnt:= ser.RecvBufferStr(5,1000); // mudar o tamanho da string (5)
Edit1.Text:= Char(Ord(DatEnt[1])+$30)+ Char(Ord(DatEnt[2])+$30)+Char(Ord(DatEnt[3])+$30)+Char(Ord(DatEnt[4])+$30) ;

// Edit1.Text:= ser.Recvstring(1000); // Não conseguí receber
{ C:= ser.RecvByte(1000); //
Edit1.Text:= Char(C+$30); }

finally
ser.Free;
end;

Espero que tenha sucesso.

MensagemEnviado: 07 Jun 2008 23:30
por RobL
Aqui as variáveis usadas acima:


var
RelStr: String ;
DatEnt: String ;
ser:TBlockSerial;
C:byte;