Считайте последовательный порт в любом месте кода - PullRequest
0 голосов
/ 05 мая 2020

Добрый вечер. У меня проблема с кодом, который я пытаюсь разработать в C #. Моя трудность заключается в чтении последовательного порта, когда программа находится в другом методе, например, при выполнении инструкции «while» или «for». Все сделанные мной попытки, информация о последовательном порте, отображаются только тогда, когда циклы завершены, и я хочу, чтобы счетчик отображался в текстовом поле, и когда информация поступает на последовательный порт, счетчик останавливается, а значение текущее. фиксируется в TextBox. Я провел много исследований о том, как работают последовательные порты, но считаю, что у меня нет более глубокого понимания программирования C #. Короче говоря, мне нужно прочитать последовательный порт из любого места кода. Мне нужна ваша помощь. Благодарен. Вот часть моего кода ...

""
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;
using System.Collections.Concurrent;


namespace Controle_de_CNC_Caseira
{
    public partial class Form1 : Form
    {
        bool status = true;
        float pulsos = 0.005f;
        float valorr;
        bool flag_probe = true;
        string DataIn;
        string controle;//conTrole XON, XOFF

//==========================================================================================================================
        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";
            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;          

        }

//=====================================================================================================================      
        void GetavailablePorts()
        {
            string[] ports = SerialPort.GetPortNames();
            cboPortas.Items.AddRange(ports);

        }
//==============================================================================================================================
        private void BTNconectar_Click(object sender, EventArgs e)
        {

            DadosRecebidos.Items.Clear();
            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;
                    ArquivoDeCodigo.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();
                    progressBar1.Value = 100;
                    string Conectar = "W";
                    while (!serialPort1.IsOpen)
                    {;}
                    for (int t=0; t<1;t++)
                    {
                        EnviarComando(Conectar);
                    }

                   EnviarComando(Conectar);
                   ComandosEnviados.Text = "";                  
                }
            }
        }
//========================================================================================================================================
        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;
            ArquivoDeCodigo.Enabled = false;
            ValorRef.SelectedIndex=1;
            cbxFeedRate.SelectedIndex = 8;
        } 
//====================================================================================================================================
       private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                while (serialPort1.BytesToRead > 0)
                {
                    DataIn = serialPort1.ReadLine();
                    this.Invoke(new EventHandler(MostraDados));
                }
            }
            catch(Exception ex)
            { } 
        }
//==============================================================================================================================
       private void MostraDados(object sender, EventArgs e)
       {
           switch (DataIn)
           {
               case "19\r":
                   status = false;                  
                   break;

               case "17\r":
                   status = true;

                   if (botãoEnviaGcode)
                   {
                       LinhaArquivo++;
                       EnviaGcode();
                   }
                   break;

               default:

                   FiltroDadosRecebidos(DataIn);
                   break;
           }
       }

//=====================================================================================================================================
    private void FiltroDadosRecebidos(string valorRecebido)
   {
       float x, x1 = 0;
       float z1 = 0;
       float y, y1 = 0;
       float z = 0;
       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, 1);

                  DadosRecebidos.Text += " eixo =" + eixo + Environment.NewLine;
                  DadosRecebidos.Text += " tamanho="  + tamanho + Environment.NewLine;

               switch (eixo)
               {

                   case "Q":
                                   txtPosdesjadaZ.Text = "2.000";
                                   txtPosAtualZ.Text = "2.000";
                                   break;
                   case "P":
                                   flag_probe = false;
                                   break;

                   default :
                                    DadosRecebidos.Items.Add(valorRecebido);
                                    break;
               }
            }      
  }
//=====================================================================================================================================
      private void button7_Click(object sender, EventArgs e)
      {
    for( int i=0;i<10000;i++)
    {
           contador.Text=Convert.ToString(i);
           contador.Refresh();
           if ( flag_probe==false)
        {                        
            i=10000;
        }
        }

      }

""

...