C#如何监控串口是否异常断开连接,并在断开后自动重连

C#如何监控串口是否异常断开连接,并在断开后自动重连

在工业控制软件中,经常要连接串口设备进行数据的读取,这时候就要监控设备串口的连接情况,当串口出现异常断开时,要跳出提醒或由程序作出进一步的逻辑处理。
但是很遗憾,在C#常用的System.IO.Ports.SerialPort类下,没有能直接找到监控串口断开的方法,那就自己写个Task来监控吧。

一、创建Winform项目

创建一个简单的form窗体,啥也不用画,进入后台逻辑。的
在窗体的构造体里初始化串口,并创建开启一个任务monitorPortTask

        private Task _monitorPortTask;
        private SerialPort _myCom;
        public Form1()
        {
            InitializeComponent();
            _myCom = new SerialPort();
            _myCom.PortName = "COM6";
            _myCom.BaudRate = 19200;
            _myCom.Parity = Parity.None;
            _myCom.DataBits = 8;
            _myCom.StopBits = StopBits.One;
            _monitorPortTask = new Task(MonitorPort);
            _monitorPortTask.Start();
        }

二、监控串口断开逻辑

在MonitorPort方法体里写入监控串口断开的逻辑,这个方法就是被上一步Task调用开启的方法。
方法体里的一些逻辑都已用注释标明。

 private void MonitorPort()
        {
            bool connectStatus = false;
            string[] gCOM = null;
            while (true)
            {
                gCOM = null;
                connectStatus = false;
                gCOM = System.IO.Ports.SerialPort.GetPortNames(); // 获取设备的所有可用串口
                int j = gCOM.Length; // 得到所有可用串口数目
                //判断是否找到串口,没有则直接报错
                if (j != 0)
                {
                    for (int i = 0; i < j; i++)
                    {
                        //找到目标串口
                        if (gCOM[i].ToUpper() == "COM6")
                        {
                            //判断目标串口是否打开
                            if (_myCom.IsOpen)
                            {
                                connectStatus = true;
                            }
                            else
                            {
                                try
                                {
                                    //尝试打开串口
                                    _myCom.Open();
                                    connectStatus = true;
                                }
                                catch (Exception)
                                {
                                    //打开失败给false状态
                                    connectStatus = false;
                                }

                            }
                            break;
                        }
                    }
                    if (connectStatus)
                    {
                        MessageBox.Show("COM6串口已成功连接!");
                    }
                    else
                    {
                        MessageBox.Show("COM6串口已断开!");
                    }
                }
                else
                {
                    MessageBox.Show("COM6串口不存在!");
                }

                Thread.Sleep(2000);
            }

三、测试

打开Form程序,拔插COM6的连接设备可以看到得到正确的提示:
在这里插入图片描述

在这里插入图片描述

小结

以上就是使用C#监控串口断开,并自动重连的逻辑功能,可以利用connectStatus对串口断开和连入做一些自己想要的逻辑。
各位如有更好的方法欢迎交流~~

C#中实现串口通信加入心跳包来监测设备是否一直处于连接状态是一种常见的做法。下面是一个简单的思路和步骤: ### 实现流程 1. **初始化SerialPort** 使用`System.IO.Ports.SerialPort`类创建串口实例,设置波特率、数据位等参数。 2. **发送心跳包** 定义一个周期性任务(如定时器),每隔一段时间向串口发送指定的心跳包内容,例如字符串“HEARTBEAT”或自定义协议帧。 3. **接收响应** 监听从串口中返回的数据流,判断是否有对应的心跳回应信号。如果接收到正确的回应,则表示设备正常在线;如果没有及时反馈超过一定次数,则认为断开连接。 4. **处理异常情况** 当检测到无应答时触发新连接机制或者其他错误处理措施,比如提示用户检查物理连线或者软件配置问题。 5. **停止操作前关闭资源** 确保程序结束之前释放掉所有占用的硬件端口资源以防冲突或其他潜在风险。 ```csharp using System; using System.IO.Ports; public class SerialHeartbeatMonitor { private SerialPort _serialPort = new SerialPort(); public void StartMonitoring(string portName, int baudRate){ // 配置串口号及速率 _serialPort.PortName = portName; _serialPort.BaudRate = baudRate; OpenPort(); Timer timer = new Timer(CheckConnectionCallback,null , TimeSpan.Zero,TimeSpan.FromSeconds(5)); } private void CheckConnectionCallback(Object stateInfo) { if (_serialPort.IsOpen && SendAndReceiveResponse("PING")){ Console.WriteLine("Still Connected!"); } else{ HandleDisconnect(); } } bool SendAndReceiveResponse(String command){ try{ _serialPort.Write(command + "\r\n"); string response=_serialPort.ReadLine(); return "PONG".Equals(response.Trim()); } catch(Exception ex){return false;} } void HandleDisconnect(){ ClosePort(); Console.WriteLine("Disconnected! Attempting reconnect..."); Task.Delay(5000).Wait(); //等待几秒再尝试恢复链接 OpenPort(); } void OpenPort(){if (!_serialPort.IsOpen)_serialPort.Open();} void ClosePort(){if(_serialPort.IsOpen)_serialPort.Close();} } ``` 上面展示了基本框架结构代码示例。实际应用需要依据具体情况调整参数以及增加更多健壮性的功能支持。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fan Felix

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值