保持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);
}
基本上我认为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);
}
第二个方法对于注销事件非常重要。例如,如果您关闭应用程序。否则应用程序将挂起。如果您注册了事件,请务必注销它们,因为事件处理程序还会阻止垃圾收集清理您的对象。