串口 myPort.Datareceived C#

serial port myPort.Datareceived C#

你好,朋友们有一个 C# 形式,可以从连接的串行设备读取数据,我的问题是我什至改变了方法 myPort.DataReceived 的形式,仍然 运行 宁和接收数据。我无法关闭与串行端口的连接,因为该方法不会停止 excutar。当我更改我的表单时,我尝试了一个命令来压缩它,但是当你尝试 运行 myPort.Close 时它崩溃了,我相信这就是为什么 myPort.DataReceived 仍然 运行 ning,所以我删除了代码,它继续 myPort.Close 以另一种形式打开。我认为我的解决方案是停止 myPort.DataReceived 然后关闭连接,但找不到方法 this.Below 是我的代码的摘录:

namespace EntradaFinalCliente
{
    

    public partial class ConsultaSerial : Form
    {
        
        string SerialString;
        private SerialPort myport;
        
        
        public ConsultaSerial()
      {
            InitializeComponent();
            abrirSerial();
            lerDados();
        }

        public void abrirSerial()
        {
            
            myport = new SerialPort(); 
            myport.BaudRate = 9600;
            myport.PortName = SerialPort1; 
            myport.DataReceived += myport_DataReceived;
           
        }

        private void lerDados()
        {

            if (myport.IsOpen == false) 
            {
                try
                {
                    myport.Open(); 
                }
                catch
                {
                    return;
                }
                
            }
           
        }

        private void myport_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            Thread.Sleep(100); 
            SerialString = myport.ReadExisting();
            this.Invoke(new EventHandler(Analisa));
            
        }

        private void Analisa(object sender, EventArgs e)
        {
            checarSerial();
            
        }

这是我关闭表单的按钮:

private void button1_Click (object sender, EventArgs e)
{
   myPort.Close ();
   this.Hide ();
   var form1 = new Form1 ();
   form1.Closed + = (s, args) => this.Close ();
   Form1.Show ();
}

您遇到的问题是,一旦事件被触发,您的应用程序就会进入函数 myport_DataReceived。无论端口是否关闭,函数都会继续执行。如果端口已经关闭,函数将最后一次执行。等待 100 毫秒会使情况变得更糟。所以我的建议是删除等待并在代码周围放置一个 try catch 语句以使线程干净地终止。

此外,使用 sender 读取传入数据比使用成员 myPort 更好,因为 sender 是触发事件的那个。当您打开两个或更多端口时,它还有助于消除混淆。

还建议 DataReceived 事件处理函数的主体应保持最少。只做你需要的事情来获取数据。然后您可以将数据存储在内存中,并使用存储的数据在其他地方进行更复杂的处理。

  private void myport_DataReceived(object sender, SerialDataReceivedEventArgs e)
  {
      Thread.Sleep(100); // Why do you need to wait for 100 ms? If the event reaches here, it will have the data to read. Can remove?
      try
      {
          SerialPort sp = (SerialPort)sender;
          SerialString = sp.ReadExisting();
          this.Invoke(new EventHandler(Analisa));
      }
      catch (Exception ex)
      {
           // Do something else
           Console.WriteLine(ex.Message);
      }

  }