串口断线重连

串口脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO.Ports;
using System.Threading;
using System;
using System.Management;

public class Com2App : AutoInstance<Com2App>
{
    SerialPort port;
    public static string comName;
    Thread initThread;
    Thread recThread;
    Thread checkThread;
    public bool isChange;
    public bool isLink;
    int recInt = 0;
    public int RecInt
    {
        get
        {
            return recInt;
        }
        set
        {
            if (recInt != value)
            {
                recInt = value;
                isChange = true;
            }
        }
    }


    private void InitPort()
    {
        ExceptionManagement.AddLogInfo("初始化串口", MyLogType.Log);

        port = new SerialPort(comName, 115200);
        port.StopBits = StopBits.Two;
        port.DataBits = 8;
        port.Parity = Parity.None;
        while (!port.IsOpen)//未插入串口时保持轮询
        {
            try
            {
                port.Open();
            }
            catch
            {
                continue;
            }
            Thread.Sleep(500);
        }
        isLink = true;
        InitThread();
    }
    private void InitThread()
    {
        if (recThread == null)
        {
            recThread = new Thread(port_DataReceived);
            recThread.Start();
        }
        if (checkThread==null)
        {
            checkThread = new Thread(Work);
            checkThread.Start();
        }

    }

    void Work()
    {
        ExceptionManagement.AddLogInfo("work", MyLogType.Log);
        while (checkThread.IsAlive)
        {
            try
            {
                if (isLink) //串口已打开
                {
                    //ExceptionManagement.AddLogInfo("串口已打开", MyLogType.Log);
                }
                else
                {
                    //串口重连逻辑
                    ExceptionManagement.AddLogInfo("串口已拔出", MyLogType.Log);
                    //if (OnComStatus != null) OnComStatus(true);
                    if (port != null)
                    {
                        if (recThread != null)
                        {
                            recThread.Abort();
                            recThread = null; 
                            Thread.Sleep(300);
                        }
                        
                        port.Close();
                        port.Dispose();
                        port = null;
                    }
                    Thread.Sleep(100);
                    if (!string.IsNullOrEmpty(comName))
                    {
                        InitPort();
                        //port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
                        ExceptionManagement.AddLogInfo("重新连接串口", MyLogType.Log);
                        //if (OnComStatus != null) OnComStatus(false);
                    }
                }
            }
            catch (Exception e)
            {
                string erroMsg = e.Message;

                ExceptionManagement.AddLogInfo("work有问题: " + erroMsg, MyLogType.Error);
            }
            Thread.Sleep(3000);
        }
    }

    void port_DataReceived()
    {
        ExceptionManagement.AddLogInfo("接收线程准备", MyLogType.Log);
        Thread.Sleep(1000);
        while (isLink)
        {
            try
            {
                int count = port.BytesToRead;
                if (count > 0)
                {
                    byte[] datas = new byte[count];
                    port.Read(datas, 0, count);
                    RecInt = datas[0];
                    //ExceptionManagement.AddLogInfo($"接收的指令: {RecInt}", MyLogType.Log);

                }

            }
            catch (Exception e)
            {
                string erroMsg = e.Message;
                ExceptionManagement.AddLogInfo($"串口收线程有问题{erroMsg}", MyLogType.Error);
                isLink = false;//串口拔出时进入重连逻辑
            }

        }

    }



    private void Awake()
    {
        Initialize();

    }
    // Start is called before the first frame update
    void Start()
    {
        initThread = new Thread(InitPort);
        initThread.Start();
    }
    private void OnDestroy()
    {
        recThread.Abort();
        recThread = null;
        checkThread.Abort();
        checkThread = null;
    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;

public enum MyLogType
{
    Log,
    Error,
}
public class ExceptionManagement : MonoBehaviour
{
    //public ILog log;
    public LogInfo erroLog = new LogInfo();
    public string netLog = "Cannot connect to destination host";
    public bool isDisconnect = false;
    public string devLog = "IOException: The port `COM3' does not exist.";
    public bool isNoCom = false;

    public static Queue<LogInfo> infoQueue = new Queue<LogInfo>();//日志队列


    public static string numListToString(byte[] list)
    {
        string str = "";
        foreach (int n in list)
            str += n + " ";

        return str;
    }

    public static void AddLogInfo(string message, MyLogType logType)
    {
        LogInfo logInfo = new LogInfo();
        logInfo.message = message;
        logInfo.logType = logType;
        infoQueue.Enqueue(logInfo);
    }

    public static void LogMessage(LogInfo logInfo)
    {
        string type = string.Empty;
        switch (logInfo.logType)
        {
            case MyLogType.Error:
                type = "Erro:";
                break;
            case MyLogType.Log:
                type = "Log:";
                break;
            default:
                break;
        }
        FileStream myStream = new FileStream(FileManager.Instance.logPath, FileMode.Append, FileAccess.Write);
        StreamWriter sWriter = new StreamWriter(myStream);
        sWriter.WriteLine(DateTime.Now.ToString("F") + "  " + type + "   " + logInfo.message + "\n");
        sWriter.Close();
        myStream.Close();
    }

    private void WriteLog()
    {
        //if (infoQueue == null || infoQueue.Count <= 0)
        //    return;
        //print(infoQueue);
        //print(infoQueue.Count);
        if (infoQueue == null || infoQueue.Count <= 0)
            return;
        var info = infoQueue.Dequeue();
        LogMessage(info);
    }

    void OnEnable()
    {
        Application.logMessageReceivedThreaded += HandleLog;
    }

    void OnDisable()
    {
        Application.logMessageReceivedThreaded -= HandleLog;
    }

    void HandleLog(string logString, string stackTrace, LogType type)
    {
        if (type == LogType.Error || type == LogType.Exception)
        {
            AddLogInfo(logString, MyLogType.Error);
        }
    }

    void Awake()
    {
        //Initialize();
        //1.初始化
        //log = LogManager.GetLogger(typeof(MonoBehaviour)); //需要传递调用日志类的类型

    }
    private void Update()
    {
        WriteLog();
    }
}
public struct LogInfo
{
    public string message;
    public MyLogType logType;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容