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对串口断开和连入做一些自己想要的逻辑。
各位如有更好的方法欢迎交流~~

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
以下是C#串口通信断线重连的示例代码: ```csharp using System.IO.Ports; using System.Threading; public class SerialPortManager { private SerialPort serialPort; private Thread reconnectThread; private bool isReconnecting = false; public SerialPortManager(string portName, int baudRate) { serialPort = new SerialPort(portName, baudRate); serialPort.DataReceived += SerialPort_DataReceived; serialPort.ErrorReceived += SerialPort_ErrorReceived; serialPort.Open(); StartReconnectThread(); } private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { // 处理接收到的数据 } private void SerialPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e) { if (e.EventType == SerialError.RXOver || e.EventType == SerialError.Overrun || e.EventType == SerialError.Frame || e.EventType == SerialError.RXParity) { // 发生错误,断开连接 serialPort.Close(); isReconnecting = true; } } private void StartReconnectThread() { reconnectThread = new Thread(() => { while (true) { if (isReconnecting) { // 等待一段时间后重新连接 Thread.Sleep(5000); try { serialPort.Open(); isReconnecting = false; } catch (Exception) { // 连接失败,继续等待 } } else { // 检查连接状态 if (!serialPort.IsOpen) { isReconnecting = true; } } } }); reconnectThread.Start(); } } ``` 该示例代码中,我们创建了一个`SerialPortManager`类来管理串口通信。在构造函数中,我们打开了串口并启动了一个重连线程。在重连线程中,我们不断检查串口连接状态,如果发现连接断开,则等待一段时间后尝试重新连接。在串口发生错误时,我们也会断开连接并标记需要重连

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Fan Felix

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

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

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

打赏作者

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

抵扣说明:

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

余额充值