none
Leitura da serialport em tempo real RRS feed

  • Pergunta

  • using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.IO.Ports;
    using System.IO;
    using System.Globalization;
    using System.Timers;
    using System.Threading;
    
    namespace Controle_de_CNC_Caseira
    {
        public partial class Form1 : Form
        {
          //  System.Windows.Forms.Timer TimerCom;
          //  SerialPort serialport1 = new SerialPort();
            
            float valorr;
            DateTime horas;
            DateTime horas1;
            string DataIn;
            string controle;//conrole XON, XOFF
            Boolean botãoEnviaGcode = false;
            int Tempo;
            int quant;//quantidade de linhas contida no arquivo Gcode
            int LinhaArquivo;
            //define as variaveis do desenho========================
            float X1 = 0;
            float Y1 = 0;
            float Z1 = 0;
            float Gcode = 0;
            float X2 = 0, Y2 = 0, Z2 = 0, I = 0, J = 0, F = 0, M = 0;
            //======================================================
            Image botão_black;
            Image botão_vermelho;
            Image botão_verde;
            Image botão_azul;
            Image botão_conecta;
            string pasta_imagens="";
          //  Thread.Join();
    //==========================================================================================================================
            public Form1()
            {
                InitializeComponent();
                GetavailablePorts();
                txtPosAtualX.Text = "0.000";
                txtPosAtualY.Text = "0.000";
                txtPosAtualZ.Text = "0.000";
                txtPosdesjadaX.Text = "0.000";
                txtPosdesjadaY.Text = "0.000";
                txtPosdesjadaZ.Text = "0.000";
                pasta_imagens = Application.StartupPath+@"\imagens\";
                botão_black = Image.FromFile(pasta_imagens + "botao black.png");
                botão_verde = Image.FromFile(pasta_imagens + "botao green.png");
                botão_vermelho = Image.FromFile(pasta_imagens + "botao red.png");
                botão_azul = Image.FromFile(pasta_imagens + "botão_blue.png");
                botão_conecta = Image.FromFile(pasta_imagens + "longoGreen.png");
                PTB_boataoX.BackgroundImage = botão_black ;
                PTB_boatao_X.BackgroundImage = botão_black;
                PTB_boatao_Y.BackgroundImage = botão_black;
                PTB_boataoY.BackgroundImage = botão_black;
                PTB_boatao_Z.BackgroundImage = botão_black;
                PTB_boataoZ.BackgroundImage = botão_black;
          //      PTB_botão_longo.BackgroundImage = botão_conecta;
               
    //==========================================================================================================================
            }
       public double GRAUS_TO_RAD (double DEGREE)
            {
                return Math.PI * DEGREE / 180;
            }
      //=====================================================================================================================      
            void GetavailablePorts()
            {
                string[] ports = SerialPort.GetPortNames();
                cboPortas.Items.AddRange(ports);
                
            }
    //==============================================================================================================================
            private void BTNconectar_Click(object sender, EventArgs e)
            {
    
               
                DadosRecebidos.Text = "";
                if (serialPort1.IsOpen)
                {
                    BTNconectar.Text = "Conectar";
                    serialPort1.Close();
                    progressBar1.Value = 1;
                }
                else
                {
                    if (cbovelocidade.Text == "" || cboPortas.Text == "")
                    {
    
                        TabControl1.Enabled = false;
                        label5.Enabled = false;
                        label4.Enabled = false;
                        DadosRecebidos.Enabled = false;
                        ComandosEnviados.Enabled = false;
                        groupBox4.Enabled = false;
                        ComandosEnviados.ForeColor = Color.Red;
                        MessageBox.Show("Por favor escolha a porta e a velociade");
                        TabControl1.Enabled = false;
                    }
                    else
                    {
    
                        label5.Enabled = true;
                        label4.Enabled = true;
                        DadosRecebidos.Enabled = true;
                        ComandosEnviados.Enabled = true;
                        btnGcode.Enabled = true;
                        txtarquivo.Enabled = true;
                        groupBox4.Enabled = true;
                        groupBox4.Visible = true;
                        TabControl1.Enabled = true;
                        ComandosEnviados.ForeColor = Color.Black;
                        ComandosEnviados.Text = "";
                        BTNconectar.Text = "Desconectar";
                        serialPort1.PortName = cboPortas.Text;
                        serialPort1.BaudRate = Convert.ToInt32(cbovelocidade.Text);
                        serialPort1.StopBits = StopBits.One;
                        serialPort1.Parity = Parity.None;
                        serialPort1.DataBits = 8;
                        serialPort1.Open();
                     //   timer1.Start();
                        progressBar1.Value = 100;
                        string Conectar = "W";
                        while (!serialPort1.IsOpen)
                        {
                            ; // wait for serial port to connect. Needed for native USB port only
                        }
                        for (int t=0; t<1;t++)
                        {
                            EnviarComando(Conectar);
                        }
                        
                       EnviarComando(Conectar);
    
                      
                    }
                }
            }
     //===================================================================================================================================      
            private void label5_Click(object sender, EventArgs e)
            {
    
            }
    
    
    //========================================================================================================================================
            private void Form1_Load(object sender, EventArgs e)
            {
                serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
                
    
                label5.Enabled = false;
                label4.Enabled = false;
                DadosRecebidos.Enabled = false;
                ComandosEnviados.Enabled = false;
                btnGcode.Enabled = false;
                txtarquivo.Enabled = false;
                ValorRef.SelectedIndex=1;
                cbxFeedRate.SelectedIndex = 8;
             
            }
    
           
    //========================================================================================================================================
       
    //========================================================================================================================
            private void button4_Click(object sender, EventArgs e)
            {
               
            }
    
            private void button6_Click(object sender, EventArgs e)
            {
               
            }
    
            private void button5_Click(object sender, EventArgs e)
            {
               
            }
    
            private void button7_Click(object sender, EventArgs e)
            {
               
            }
    
            private void button8_Click(object sender, EventArgs e)
            {
               
            }
    //====================================================================================================================================
           private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                try
                {             
                    
                        
                     
                        DataIn = serialPort1.ReadLine();
                        this.Invoke(new EventHandler(MostraDados));
                    
                }
                catch(Exception ex)
                { }
    
    
    
    
    
    
    
         //       this.BeginInvoke(new SetTextDeleg(TratarDados), new object[] { DataIn });
    //=========================================================================================
    
     //  BeginInvoke((MethodInvoker)(() =>      { DataIn = serialPort1.ReadLine();// }));
    //===========================================================================================
      
    
       //    DadosRecebidos.AppendText(controle);
       //    DadosRecebidos.SelectionStart = DadosRecebidos.TextLength;// esse dois comandos fazem o scroll da list box
       //    DadosRecebidos.ScrollToCaret();
       //}
         
    
      //  }));
         
                  
    
            }
    
    
    
    //=====================================================================================================================================
        private void FiltroDadosRecebidos(string valorRecebido)
       {
         //  DadosRecebidos.Text += " datain=" + DataIn+Environment.NewLine;
            string eixo="";
            int tamanho=0;
            string valorEixoAtual="";
            if (valorRecebido.Length > 1)//para codigos feitos no inkscape onde a primeira linha tem apenas uma letra ou simbolo
                {               
                        tamanho = valorRecebido.Length;           
                         eixo = valorRecebido.Substring(0, 2);
                        
                   //   DadosRecebidos.Text += " eixo =" + eixo + Environment.NewLine;
                   //   DadosRecebidos.Text += " tamanho="  + tamanho + Environment.NewLine;
                 
                   switch (eixo)
                   {
                                 
                      case "VX":
                           valorEixoAtual = valorRecebido.Substring(2, tamanho - 3);           
                                         txtPosAtualX.Text=valorEixoAtual;
                                         break;
    
                      case "VY":
                                         valorEixoAtual = valorRecebido.Substring(2, tamanho - 3);
                                        txtPosAtualY.Text=valorEixoAtual;
                                        break;
    
                      case "VZ":
                                        valorEixoAtual = valorRecebido.Substring(2, tamanho - 3);
                                        txtPosAtualZ.Text=valorEixoAtual;
                                        break;
    
                       default :
                                        DadosRecebidos.Text += DataIn + Environment.NewLine;
                                        break;
                   }
    
                }                     
                        
            }
      
    //====================================================================================================================================
          private void MostraDados(object sender, EventArgs e)
        {
          //  string DADOS;
          //  DadosRecebidos.Text += serialPort1.ReadBufferSize + Environment.NewLine;
          //  DADOS = DataIn;
            switch (DataIn)
                {
                    case "19\r":
                        textcontrole.Text = "XOFF";
    
                        break;
    
                    case "17\r":
                         textcontrole.Text = "XON";
                        if (botãoEnviaGcode)
                        {
                            LinhaArquivo++;
                            EnviaGcode();
                        }
                        break;
    
                    default:
                      //  textcontrole.Text = DataIn;
                    //   Thread.Sleep(2);
                    DadosRecebidos.Text += DataIn + Environment.NewLine;
                    //   FiltroDadosRecebidos(DataIn);
                   //    textcontrole.Text = "";
    
                        break;
    
                }
     
               
             
       
            }


    Boa noite

    Tenho pouquíssimo conhecimento em C# porém com pesquisa na internet estou conseguindo fazer o que me propus porém agora cheguei em um ponto que não consigo ver a solução. Já consegui identificar o problema.

    estou fazendo comunicação do PC com o arduino e neste caso o arduino envia mensagem tipo string VX0.100 a uma velocidade de 15 microssegundos. Envia uma serie de no mínimo 200 e pode chegar a milhares.

    NO pc , começa a ler os dados recebidos e mostrar numa textbox porem não chega até o final. sei que o buffer tem os outros valores ate o final porem não são mostrados.

    O que observei e que se envio outros comandos que façam com que o arduino envie qq mensagem, parte os dados do buffer são mostrados, por isso sei que estavam no buffer.

    Preciso de ajuda para fazer com que leia estes dados em tempo real. Meu código a seguir:

    quinta-feira, 29 de agosto de 2019 21:20

Todas as Respostas

  • JPauloSerra,

       Desculpe... TextBox? O tamanho máximo do TextBox é: "32767".

    ======================================
    TextBox.MaxLength Property with Example in C#.Net

    MaxLength property of TextBox is used to set maximum number of character that we can input into a TextBox. Limit of MaxLength property is 1 to 32767. By default this property is set to 32767.

    https://www.includehelp.com/dot-net/textbox-maxlength-property-with-example.aspx
    ======================================

       Não seria o caso de usar uma ListBox ou um Blob (dependendo do tamanho da informação que você está recebendo)?

    []'s,
    Fabio I.
    sexta-feira, 30 de agosto de 2019 11:22
  • Fabio bom dia. Obrigado pelo interesse.

    Na realidade eu não vou colocar isto tudo na textbox " dadosrecebidos". Esses valores que vão chegando vão atualizando o valor na textbox ex. "txtPosAtualX.Text" ou seja somente o ultimo é mostrado. Isso será feito na rotina "private void FiltroDadosRecebidos(string valorRecebido)".

    Ver tudo na textbox multline foi para ver o que estava acontecendo. Desculpe não ter explicado antes.

    A minha duvida é como receber esses valores, trata-los e mostra-los em tempo real. Se usar um thread para receber e outro para tratar, como faço para que uma thread acesse o mesmo local onde os dados estão sendo armazenados pelo serialPort1_DataReceived?

    Vi alguma coisa na internet mas como não tenho todo o conhecimento em programação, não entendi como pode ser feito.

    Grato

    sexta-feira, 30 de agosto de 2019 13:29