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://adf.ly/1UB4QG

Exibições: 4798

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Thomé Lucas A. Oliveira em 18 abril 2016 às 12:34

Amigo, seu gráfico é ótimo, eu preciso de um desses apenas com uma modificação, o Eixo X (horizontal) precisaria mostrar a Hora:Minuto:Segundo no formato HH:MM:ss.

Como fazer esta alteração?

Comentário de Ilgner Aparecido Becheleni em 4 outubro 2014 às 21:44

yure eu novamente estou com uma aplicação envolvendo um controle de temperatura , tenho uma maquete com 2 coolers e uma lampada , preciso controlar a lampada e os colers para ligarem e desligarem para controlar uma temperatura medida atraves de um lm35 , consigo ligar a lampada , os collers mas meu problema é na comunicação entre o microcontrolador e o pc , nao consigo ler a temperatura e tomar uma ação , de vez em quando trava. poderia me auxiliar?

Comentário de Ilgner Aparecido Becheleni em 28 abril 2014 às 12:44

Na rotina eu envio para o PIC e recebo depois de 500 ms , só que está travando a aplicação do visual

o código:

http://pastebin.com/veJ3BagH

Comentário de Yure Vieira em 26 abril 2014 às 21:23

Poste o código se ainda não tiver resolvido. 

Comentário de Ilgner Aparecido Becheleni em 23 abril 2014 às 15:49

Yure , hà a possibildiade de enviar e receber o arquivo no mesmo momento sem travar o programa , o meu está travando..

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço