保持IO端口打开

时间:2014-05-08 14:13:21

标签: c# serial-port ports

我有一个串口,我想保持它开放以接收消息。这是正确的方法吗?我想在没有while循环的情况下完成此操作,但我认为如果删除它将完成void()和连接。或者这是不正确的,只要我不关闭连接,它将继续接收数据(参见代码块2)?

      public void Scanner(object sp)
      {

        this.sp = (SerialPort)sp;

        this.sp.Open();
        this.sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
        Console.WriteLine("port {0} open waiting message", this.sp.PortName);
        while (!_terminate)
        {
            Thread.Sleep(100);
        }
        Console.WriteLine("termination code received closing port {0}.", this.sp.PortName);
        this.sp.Close();
      } 

还是喜欢这个?

      public void Scanner(object sp)
      {

        this.sp = (SerialPort)sp;

        this.sp.Open();
        this.sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
      }

另一件事是我觉得我应该把事件处理程序移到虚空之外。 void由ParameterizedThreadStart调用,因此它的签名必须是void name(object o){}。我想我应该把它移到构造函数中吗?

现在

构造函数

   public SerialComms(){}

我认为它应该是

   public SerialComms()
   {  
     this.sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
   }

1 个答案:

答案 0 :(得分:1)

基本上我认为第2块更好,因为如果有可用数据,您会收到异步通知。只要你不打电话给"关闭" comport的方法,它将接收数据。

此外,我建议(关于事件主题)制作两个分离的方法,如:

public void OpenPort()
{
     this.sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
     this.sp.Open();
}

public void ClosePort()
{
     this.sp.Close();
     this.sp.DataReceived -= new SerialDataReceivedEventHandler(sp_DataReceived);
}

第二种方法对取消注册事件非常重要。例如,如果您关闭应用程序。否则您的应用程序将挂起。如果您注册了事件,请务必取消注册事件,因为事件处理程序也会阻止垃圾收集清理对象。