Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在.NET中检测通过串行端口或以太网连接的设备状态的变化_C#_Winforms_Serial Port_Ethernet_Tcp Ip - Fatal编程技术网

C# 如何在.NET中检测通过串行端口或以太网连接的设备状态的变化

C# 如何在.NET中检测通过串行端口或以太网连接的设备状态的变化,c#,winforms,serial-port,ethernet,tcp-ip,C#,Winforms,Serial Port,Ethernet,Tcp Ip,我有一个通过串口和以太网连接到控制器的应用程序。控制器不断地向PC发送数据。我正在用C#编写应用程序。我在c#中创建了SerialPort对象,并在dataReceived方法中接收数据。类似地,对于以太网,我使用了TCPListener及其方法startAcceptClient来接受来自客户端的连接 现在,我的问题是,控制器是否已关闭电源或电缆是否已从PC上拔下;如何在应用程序中检测这些事件?我对TCPListener不太熟悉,但对于SerialPort,我使用计时器,每次勾选时我都会检查端口

我有一个通过串口和以太网连接到控制器的应用程序。控制器不断地向PC发送数据。我正在用C#编写应用程序。我在c#中创建了SerialPort对象,并在dataReceived方法中接收数据。类似地,对于以太网,我使用了TCPListener及其方法startAcceptClient来接受来自客户端的连接


现在,我的问题是,控制器是否已关闭电源或电缆是否已从PC上拔下;如何在应用程序中检测这些事件?

我对TCPListener不太熟悉,但对于SerialPort,我使用计时器,每次勾选时我都会检查端口是否仍然打开

private void ComTimer_Tick(object sender, EventArgs e)
    {
        if (SerialPort.IsOpen)
        {
            dostuff
        }
        else if (!SerialPort.IsOpen)
        {
            ComCheckTimer.Stop();
            MessageBox.Show("Connection lost"); 
    }
}
计时器呢

ComCheckTimer = new Timer();
ComCheckTimer.Tick += new EventHandler(ComTimer_Tick);
ComCheckTimer.Interval = 1000;

这将创建一个每1000毫秒滴答一次的计时器

这是两个不同的问题。RS232(串行端口)可检测断层0。TCP/IP不能。TCP唯一的机会是尝试写入,如果连接断开,将导致IOException。一个很好的提示是跟踪传入消息的频率。如果您检测到频率严重下降,您可能会触发有关连接中断的调查。感谢您的及时响应。那么,如何在串行端口情况下进行检测对于串行端口,您可以在此处进行查看:您可能希望触发Pinchhanged事件来告诉您DsrChanged握手信号已关闭。它不是100%可靠,串行设备并不总是打开它,断开的长rs-232电缆可以像天线一样接收电噪声。到目前为止,操作串行设备的最好方法是永远不要弄乱它。我也使用了类似的场景