串口myPort.Datareceived C#

时间:2015-09-10 22:47:57

标签: c# visual-studio-2010 serial-port

你好朋友在C#中有一个表单从连接的串口设备读取数据,我的问题是我甚至改变了myPort.DataReceived方法仍在运行和接收数据的形式。我无法关闭与串口的连接,因为该方法不会停止excutar。当我改变我的表单时我尝试了拉链的命令,但是当你尝试运行myPort.Close时崩溃了,我相信这就是为什么myPort.DataReceived仍在运行,所以我删除了代码并继续myPort 。以另一种形式关闭。我认为我的解决方案是停止myPort.DataReceived然后关闭连接,但无法找到方法来执行此操作。下面是我的代码的摘录:



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 ();
}




1 个答案:

答案 0 :(得分:0)

您遇到的问题是,一旦触发事件,您的应用程序就会进入函数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);
      }

  }