Добрый вечер. У меня проблема с кодом, который я пытаюсь разработать в 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;
}
}
}
""