Ir para conteúdo
  • Cadastre-se

dev botao

ACBrBAL - TimeOut gera Exception em vez de retornar código/peso -9


sismais
  • Este tópico foi criado há 1043 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro

Olá pessoal, tudo bem?

Já uso ACBrBAL (balança de checkout) há um tempo, e funciona bem, porém algo está me intrigando e gostaria de saber se pode ser melhorado no componente.

Atualmente, na leitura de peso (seja chamando o LePeso() ou programando no evento OnLePeso), se houver problemas de TimeOut retorna o peso "-9" indicando problemas na comunicação.

Porém, em dado momento, ocorre a Exception de TimeOut (em vez de retornar o "-9").

Adentrando no componente, verifiquei que o problema ocorre no ponto abaixo:

-> function TACBrBALClass.LePeso(MillisecTimeOut: Integer): Double;
--> procedure TACBrBALClass.SolicitarPeso;
---> procedure TACBrDevice.EnviaString(const AString: AnsiString);
-----> procedure TACBrDeviceSerial.EnviaString(const AString: AnsiString);
Linha 578 (ACBrDeviceSerial.pas): BytesSent := fsSerial.SendBuffer(Pointer(Buffer), BytesToSend);

Nessa linha ocorre este erro:

image.png.ebf87e7dc9ffdc66ed6beb5a8ee89baf.png

Estou fazendo testes usando o Emulador de Balança do ACBr (e um par de portas seriais virtuais).
Para conseguir simular esse erro, eu fecho emulador e aciono a leitura no meu PDV. Quero simular situações onde há falhas na comunicação com a balança.
 

Eu vi que, dentro do método LeSerial() que é chamado em TACBrBALClass.LePeso(MillisecTimeOut: Integer), o tratamento de TimeOut e retorno do "-9" é feito como esperado, mas no "SolicitarPeso", que é acionado também dentro do LePeso(), esse tratamento não é feito.

No início, imaginei que fosse algo com as portas seriais virtuais, até que ocorreu em um cliente. 
Uma outra observação que fiz também foi: Não ocorre na primeira vez que aciono a leitura, e sim lá pela terceira em diante. (nas primeiras ela passa por esse método sem erro e retorna o código -9, quando aciona o LeSerial().

A minha dúvida é, seria possível tratar para que retorne também o código/peso "-9" em vez de gerar uma Exception?

Não sei se consegui explicar corretamente.

Desde já agradeço.

Link para o comentário
Compartilhar em outros sites

  • Consultores

   Boa tarde.

Em 19/05/2021 at 13:28, maiconsaraiva disse:

Adentrando no componente, verifiquei que o problema ocorre no ponto abaixo:

-> function TACBrBALClass.LePeso(MillisecTimeOut: Integer): Double;
--> procedure TACBrBALClass.SolicitarPeso;
---> procedure TACBrDevice.EnviaString(const AString: AnsiString);
-----> procedure TACBrDeviceSerial.EnviaString(const AString: AnsiString);
Linha 578 (ACBrDeviceSerial.pas): BytesSent := fsSerial.SendBuffer(Pointer(Buffer), BytesToSend);

Em 19/05/2021 at 13:28, maiconsaraiva disse:

Eu vi que, dentro do método LeSerial() que é chamado em TACBrBALClass.LePeso(MillisecTimeOut: Integer), o tratamento de TimeOut e retorno do "-9" é feito como esperado, mas no "SolicitarPeso", que é acionado também dentro do LePeso(), esse tratamento não é feito.

   Boa análise... Muito obrigado. Isso facilita bastante pra gente poder dar um parecer. Vamos lá...

   De certa maneira, acredito que você tenha razão. Se o TimeOut está ocorrendo aí, então está faltando mesmo um tratamento para o retorno.

   Mas o tratamento não poderia ser feito no "SolicitarPeso", porque esse método não tem retorno.

   Teria que ser feito nos outros métodos que chamam esse "SolicitarPeso, como "LePeso" e "AguardarRespostaPeso".

Em 19/05/2021 at 13:34, maiconsaraiva disse:

Obs: Eu sei que, alterando o componente é possível, mas não sei até que ponto isso iria interferir em quem já usa atualmente, e seu eu poderia fazer e subir os fontes para integração ao fonte oficial.

   Você pode alterar e anexar aqui para que possamos avaliar sim.

   Vou pedir pra você apenas ficar atento ao seguinte:

   1) Seria bom verificar no log se o timeout está mesmo ocorrendo.

   2) fazer o ajuste apenas na classe TACBrBalClass vai ajustar a maioria dos modelos, mas alguns sobrescrevem esses métodos (em especial LeSerial e LePeso) e assim pode ser necessário um ajuste na classe delas.

  • Curtir 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...
  • Membros Pro
Em 25/05/2021 at 16:35, EMBarbosa disse:

   Boa tarde.

   Boa análise... Muito obrigado. Isso facilita bastante pra gente poder dar um parecer. Vamos lá...

   De certa maneira, acredito que você tenha razão. Se o TimeOut está ocorrendo aí, então está faltando mesmo um tratamento para o retorno.

   Mas o tratamento não poderia ser feito no "SolicitarPeso", porque esse método não tem retorno.

   Teria que ser feito nos outros métodos que chamam esse "SolicitarPeso, como "LePeso" e "AguardarRespostaPeso".

   Você pode alterar e anexar aqui para que possamos avaliar sim.

   Vou pedir pra você apenas ficar atento ao seguinte:

   1) Seria bom verificar no log se o timeout está mesmo ocorrendo.

   2) fazer o ajuste apenas na classe TACBrBalClass vai ajustar a maioria dos modelos, mas alguns sobrescrevem esses métodos (em especial LeSerial e LePeso) e assim pode ser necessário um ajuste na classe delas.

Obrigado pelo retorno. Como estava corrido, acabei contornando pela minha aplicação.

Mas vou deixar como tarefa aqui, e faço assim que tiver um tempinho.

Sobre as suas perguntas:

1. Sim, ocorre, tanto que, no método LePeso, o timeout funciona normal. O problema ocorre no SolicitarPeso que fica logo acima de LePeso.
Pelo que entendi, parece funcionar de forma assíncrona, enviando o comando no SolicitarPeso, e depois pegando a resposta no LePeso. Sendo este o caso, o TimeOut está implementado apenas no LePeso.

2. Certo, farei essa checagem também;

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 1043 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.