保持IO端口打开

本文关键字:IO 保持 | 更新日期: 2023-09-27 18:02:17

我有一个串行端口,我想保持它挂开接收消息。这是正确的做法吗?我想在没有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之外。void被ParameterizedThreadStart调用,所以它的签名必须是void name(object o){}。我想我应该把它移到构造函数中,对吧?

构造函数

   public SerialComms(){}

我认为它应该是什么

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

保持IO端口打开

基本上我认为block 2更好,因为如果有可用的数据,您将获得异步通知。只要你不调用该端口的"close"方法,它就会接收数据。

此外,我建议(关于事件主题)创建两个独立的方法,如:

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

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