Crie seu próprio programa de comunicação serial em C# - Tutorial 4(Leitura e Gráficos)

Depois de tanto tempo um tutorial sobre leitura, após muita pesquisa e uma força de um membro da comunidade este tutorial saiu.

Queria agradecer ao Marlon Tiedt que sugeriu a forma de leitura que será usada aqui, a forma mais simples e eficiente que encontrei até agora.

No tutorial de hoje além de ler a porta serial, vamos trabalhar com o controle Chart afim de plotar gráficos dos valores que forem chegando.

Hoje serão usados os seguintes controles:

  • SerialPort
  • Chart

O Chart só foi adicionado a partir do Visual Studio 2010, espero que tenham seguido a dica que dei no primeiro tutorial!

O programa do arduino é o exemplo Graph, aumentem o delay para mais de 50, para melhorar a visualização.

Chart pode ser encontrado em dados.

Redimensionem para que cubra todo o formulário.

Logo após ancorem o chart1 marcando todas as quatro barras na propriedade Anchor.

Isso fará com que ele seja redimensionado acompanhando o tamanho do formulário.

Retirem a legenda, pois achei desnecessário para este exemplo.

Na rotina de DataReceived é a que usaremos para ler a porta serial. 

Nesta rotina temos que ler o buffer e atualizar o gráfico, então a rotina de vê ficar parecida com essa:

private void Porta_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)

        {

            BeginInvoke(new Action(() =>

            {

                try

                {

                    int limite = 50;//Número máximo de pontos que o gráfico pode ter.

                    string dados = Porta.ReadLine();//Pegue o que tem no buffer até um '\n'.

                    Text = dados;//Mostrar o valor na barra de titulo.

                    int num = Convert.ToInt16(dados);//Converta a string para int.

                    chart1.Series[0].Points.AddY(num);//Adiciona o valor lido como um novo Y;

 

                    //Se o gráfico tiver número de pontos maior que o limite...

                    if (chart1.Series[0].Points.Count > limite)

                    {

                        chart1.Series[0].Points.RemoveAt(0);//Remova o primeiro ponto.

                        chart1.Update();//Atualiza o grafico.

 

                    }

                }

                catch { }

            }));

        }

O funcionamento é simples, caso chegue algo pela serial (uma string do valor contendo '\n' no final) a rotina adiciona um ponto ao gráfico, com Y equivalente ao valor lido.

O variável limite esta relacionada ao limite de quantos pontos o gráfico mostrará, ao superar este limite o primeiro ponto do gráfico é apagado e este é atualizado.

BeginInvoque(new Action(()=>{//rotina...})); faz essa tarefa “paralelamente” ao fluxo(thread)  principal do programa, pois caso fosse feito no principal o usuário perderia o controle sobre sua aplicação causando travamentos.

Apesar de ser orientado a eventos, um evento só pode ser atendido caso o programa esteja disponível para atendê-lo. Imaginem se chegassem dados tão rápido que não houvesse tempo nem mesmo de mover o aplicativo! Por isso fez o uso de outro seguimento que pode executar suas instruções “ao mesmo tempo” do seguimento principal.

Ao final, o resultado será parecido com esse:

Mudem o estilo do gráfico para Range, acessando a propriedade Series .

O aspecto mudou, parecendo uma função continua:

Para mudar a cor do gráfico escolham uma cor em PaletteCustonColors:

E depois mudem Palette para none

O resultado:

Assim conseguimos plotar gráficos com dados vindos do arduino, adaptem a suas necessidades. Até a próxima.

Código completo:

http://pastebin.com/cbzt5UJZ

Exibições: 1389

Responder esta

Respostas a este tópico

Po cara , valeu , esperei ansiosamente por este tutorial , Parabéns !!

Parabéns pela iniciativa e pela qualidade do tuto!

Muito bom.

Obrigado.

Ola.

um help, please.

o programa esta funcionando 100%, porém esta travando quando escrevo o dado recebido em um richtext. Poderia me ajudar?

Obrigado.

Você esta escrevendo no richtext antes ou depois que o dado recebido foi tratado ? tenta escrever apos receber o dado e armazenar na String , leia o dado puro.

Também não estou conseguindo...está travando tudo.Também estou utilizando um richtext

OBRIGADUUUU!!!!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço