【问题标题】:How to detect change in the state of device connected through serial port or ethernet in .NET如何在.NET中检测通过串口或以太网连接的设备状态的变化
【发布时间】:2018-07-04 14:16:28
【问题描述】:

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

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

【问题讨论】:

  • 这是两个不同的问题。 RS232(串行端口)可以检测损坏的第 0 层。TCP/IP 不能。 TCP 唯一的机会是尝试写入如果连接断开会导致 IOException。一个很好的提示是跟踪传入消息的频率。如果您检测到频率严重下降,您可能会触发有关连接中断的调查。
  • 感谢您的及时回复。那么如何在串口情况下检测
  • 对于串行端口,您可以在这里查看:stackoverflow.com/q/13408476/982149
  • 您希望 PinChanged 事件触发以告诉您 DsrChanged 握手信号已关闭。它不是 100% 可靠的,串行设备并不总是打开它,断开的长 rs-232 电缆可以像天线一样工作并拾取电噪声。到目前为止,操作串行设备的最佳方法是永远不要乱用它。

标签: c# winforms serial-port ethernet tcp-ip


【解决方案1】:

我对 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 毫秒计时一次的计时器

【讨论】:

  • 我也用过类似的场景
猜你喜欢
  • 2023-04-05
  • 2019-05-15
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 2014-03-11
相关资源
最近更新 更多