Página 1 de 1

Visual C# ProgressBar + String

MensagemEnviado: 20 Mar 2012 19:30
por wandersonrainer
Olá a todos,

estou tentando inserir o valor de uma string em um ProgressBar no Visual C#. A string possui o valor de uma recepção serial.

Código: Selecionar todos
RxString = serialPort1.ReadExisting();


que está dentro do evento serialPort1_DataReceived.
Os valores da string apresentados em textBox fica sempre corretos, porém, ao converter o valor para variar uma ProgressBar, os valores da ProgressBar varia bastante:

Código: Selecionar todos
progressBar1.Value = Convert.ToInt32(RxString);


Alguma sugestão?

Obrigado.

Re: Visual C# ProgressBar + String

MensagemEnviado: 20 Mar 2012 22:43
por andre_luis
Qual é a magnitude dos valores recebidos, e qual é o tamanho configurado do progressbar ?


+++

MensagemEnviado: 21 Mar 2012 09:23
por wandersonrainer
Os valores recebidos variam de 0 a 1023 (conversão A/D de 10 bits proveniente de um MCU). O progressbar também foi configurado como 0 (mínimo) e 1023 (máximo).
Os valores recebidos (de 0 a 1023) são apresentados normalmente em textbox, porém, o progressbar acompanha o valor do textbox mas de forma intermitente o valor varia de forma brusca.

MensagemEnviado: 21 Mar 2012 21:38
por andre_luis
No C++ Borland Builder, há uma função chamada processmessages(), cuja função é sincronizar as funções.

Procura ver se no C# tem algo parecido.


+++

MensagemEnviado: 25 Mar 2012 23:03
por chipselect
Em c#, o equivalente mais próximo de "processMessages()" é Application.DoEvents(), mas não se recomenda usar essas coisas...

Acho que o comando
progressBar1.Value = Convert.ToInt32(RxString);
é susceptível a falhas e deve-se tratar as exceções FormatException e OverFlowException, mesmo que os valores do AD só vão até 1023, pois você tem o problema de possível lixo na serial, além de ela ser assíncrona, ou seja, na hora que você efetua o comando de leitura, pode ser que não tenha recebido todo o seu pacote, ter recebido um pacote e um pedaço do próximo e etc.

Um problema intermitente que pode vir a ocorrer é quando RxString contém algo que não é bem um número, quando na eventualidade de a serial ter recebido lixo, ponto em que a conversão gera uma exceção e o dotnet sacana simplesmente aborta o laço da thread sem te falar nada, já que não tem o try - catch ali pra pegar o problema.

Uma vez que você não postou o trecho de código completo, essas afirmativas acimas são apenas especulações.

Talvez no texbox a variação seja tão rápida que você não perceba sua variação, coloque um log em cima disso para ver o que você está processando ao receber os dados pela serial, se não tiver nenhum ai, use o velho Console.WriteLine(RxString) mesmo toda vez que lê na serial, pelo menos vai ter um histórico do que tá lendo e pode esclarecer o que está ocorrendo.

Se for possível, delimite o valor transmitido pela serial por caracteres especiais, formando um protocolo mínimo para melhorar a confiabilidade dos dados recebidos (stx-etx, o bom e velho \n como delimitador, etc)