当我尝试关闭关闭rs232端口时程序冻结

时间:2016-06-18 21:41:30

标签: c# winforms serial-port port

我编写了一个C#Windows表单程序,它从RS-232端口读取权重值。

这是我的计划:

try { Brate = Convert.ToInt32(MyParam._BOUD1); }
catch { Brate = 9600; }
port = new SerialPort(MyParam._COM1, Brate, Parity.None, 8, StopBits.One);
port.DtrEnable = true;
port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);

if (port.IsOpen == false)
{
    try
    {
       port.Open();
       port.DiscardOutBuffer();
    }
    catch (Exception oex)
    {
        MessageBox.Show(oex.ToString());
    }
}

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  try
  {
    this.Invoke(new EventHandler(DoUpdate));
  }
  catch (Exception ex)
  {
  }
 }

private void DoUpdate(object s, EventArgs e)
{
  try
  {
     lblMSG2.Text = port.ReadLine().ToString();
     port.DiscardInBuffer();
  }
  catch (Exception ex)
  {
    lblMSG2.Text = ex.ToString();
  }
}

除了我尝试关闭表单以打开另一个表单时,此程序运行良好。

以下是关闭串口的方法:

if (port.IsOpen == true)
{
  port.DataReceived -= new SerialDataReceivedEventHandler(port_DataReceived);
  try
  {
     port.Close();
     port.DiscardOutBuffer();
  }
  catch (Exception oex)
  {
     MessageBox.Show(oex.ToString());
  }
}

我的程序挂起,除了退出程序并重新启动它之外我什么也做不了。

我做错了什么?

修改

我尝试了这里建议的所有内容

if (port.IsOpen == true)
{
  //port.DataReceived -= new SerialDataReceivedEventHandler(port_DataReceived);
  try
  {
    //port.Dispose();
    // port.DiscardOutBuffer();
    // port = null;
       port.Close();
   }
   catch (Exception oex)
   {
      MessageBox.Show(oex.ToString());
   }
}

但程序仍然挂起,除了退出程序并重新启动它之外我什么也做不了。

它停留在这一行:port.Close();

1 个答案:

答案 0 :(得分:0)

您的问题是,您在尝试取消订阅现有处理程序的同时声明new事件处理程序。

删除代码中的代码:

port.DataReceived -= new SerialDataReceivedEventHandler(port_DataReceived);

这很可能导致您的挂断。您根本不需要在那里拥有该代码,因为一旦您关闭了端口,您就无法获得任何新数据。此外,您应该简化尝试关闭端口时所执行的操作。将关闭端口的代码更改为:

try
{
    if(port.IsOpen)
    {
        port.Close();
    }
}
catch (Exception oex)
{
    MessageBox.Show(oex.ToString());
}

鉴于你所做的一切都是使用一个简单的事件处理程序通过端口接收一些数据,上面的代码块是你真正需要做的就是关闭端口。