Entrar    Registrar

Synaser nao recebe bytes pq?

Programação Delphi e Pascal

Moderadores: guest2003, 51

  • Autor
    Mensagem

Synaser nao recebe bytes pq?

Mensagempor Wagner de Queiroz » 14 Mai 2008 13:21

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
Seja Livre, Use Linux
Avatar do usuário
Wagner de Queiroz
Word
 
Mensagens: 872
Registrado em: 11 Out 2006 13:38
Localização: Barueri-SP

Re: Synaser nao recebe bytes pq?

Mensagempor Jorge_Francisco » 14 Mai 2008 15:57

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
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Re: Synaser nao recebe bytes pq?

Mensagempor Jorge_Francisco » 14 Mai 2008 16:01

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.

Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor Wagner de Queiroz » 14 Mai 2008 16:32

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.
Seja Livre, Use Linux
Avatar do usuário
Wagner de Queiroz
Word
 
Mensagens: 872
Registrado em: 11 Out 2006 13:38
Localização: Barueri-SP

Mensagempor Wagner de Queiroz » 22 Mai 2008 22:45

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?
Seja Livre, Use Linux
Avatar do usuário
Wagner de Queiroz
Word
 
Mensagens: 872
Registrado em: 11 Out 2006 13:38
Localização: Barueri-SP

Mensagempor RobL » 07 Jun 2008 23:26

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.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor RobL » 07 Jun 2008 23:30

Aqui as variáveis usadas acima:


var
RelStr: String ;
DatEnt: String ;
ser:TBlockSerial;
C:byte;
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Voltar para Delphi e Pascal

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron