C# 串口通信

串口通信模板,存档备用:

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

namespace ComCommunication
{
    class ComLogic
    {
        public static bool SuccessFlag = false;
        protected static SerialPort COM = new SerialPort();
        protected Thread SendThread;
        protected bool keepSending = true;
        protected int sendComDataTick = 20;
        //protected Thread ReceiveThread;//也可用线程定时侦听实现接收数据逻辑 
        protected int receiveComDataTick = 5;
        protected byte[] receiveBuffer = new byte[160];
        protected List<byte> receiveList = new List<byte>();
        protected delegate void RecEventHandler(byte[] queueByte);
        protected event RecEventHandler DataReceivedEvent;
        protected byte dealRev;
        protected byte DealRev
        {
            get { return dealRev; }
            set
            {
                dealRev = value;
                DataReceivedEvent?.Invoke(receiveBuffer);
                //DataReceivedEvent?.BeginInvoke(receiveBuffer, null, null);
            }
        }

        public LinkTrackLogic()
        {
            DataReceivedEvent += new RecEventHandler(DealDataReceivedEvent);//绑定事件
        }

        public virtual void Open(string Port)
        {
            if (COM != null && COM.IsOpen == false)
            {
                try
                {
                    COM.BaudRate = 2000000;
                    COM.PortName = Port;
                    COM.ReadTimeout = 550;
                    COM.ReceivedBytesThreshold = 8;
                    COM.DataReceived += Com_DataReceived;//串口接收事件
                    COM.Open();
                    SendThread = new Thread(SendDataHandler);
                    SendThread.Priority = ThreadPriority.Highest;
                    SendThread.IsBackground = true;
                    SendThread.Start();
                    SuccessFlag = true;
                }
                catch (Exception ex)
                {
                    //log
                }
            }
        }

        protected virtual void SendDataHandler()
        {
            while (keepSending)
            {
                try
                {
                    //处理发送数据逻辑
                }
                catch (Exception ex)
                {
                    //log
                }
                Thread.Sleep(sendComDataTick);//35ms一周期
            }
        }

        protected virtual void Com_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                Thread.Sleep(receiveComDataTick);
                int n = COM.BytesToRead;
                byte[] receiveTemp = new byte[n];
                int count = COM.Read(receiveTemp, 0, n);
                //1.缓存数据           
                receiveList.AddRange(receiveTemp);
                //2.完整性判断         
                while (receiveList.Count > 0)
                {
                    //判断帧头帧尾校验等,根据数据长度取出完整的一帧数据
                    int dataLen = receiveList.Count;//设置为协议定义长度
                    receiveBuffer = new byte[dataLen];
                    //得到完整的数据,复制到readBuffer中    
                    receiveList.CopyTo(0, receiveBuffer, 0, dataLen);
                    //从缓冲区中清除
                    receiveList.RemoveRange(0, dataLen);
                    //触发外部处理接收消息事件
                    DealRev += 1;
                }
            }
            catch (Exception ex)
            {
                //log
            }
        }

        protected virtual void DealDataReceivedEvent(byte[] receive)
        {
            try
            {
                //处理数据
            }
            catch (Exception ex)
            {
                //log
            }
        }

    }
}

 

上一篇:public private protected区别


下一篇:服务层代码提取方案: 抽取@Autowired到公共层