码迷,mamicode.com
首页 > 其他好文 > 详细

串口通讯服务类

时间:2016-08-16 09:14:20      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:

通讯事件类

    public class ComEvent
    {
        /// <summary>
        /// 数据接收事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="data"></param>
        public delegate void DataReceivedHandler(object sender, string data);

        /// <summary>
        /// 发送数据事件
        /// </summary>
        /// <param name="data"></param>
        public delegate void DataSendHandler(string data);
    }

  Com接口类

    [Guid(ComHelper.InterfaceId)]
    public interface IComHelper
    {
        void Open(string _port, int _baud, int _stopBits, int _databits, int _parity);
        void Open();
        event ComEvent.DataReceivedHandler DataReceived;
        event ComEvent.DataSendHandler DataSend;
        void Close();
        void Send(string data);
        string Read();
        bool IsComOpen();
    }

  串口通讯类

  public class ComHelper : IComHelper
    {
        public const string ClassId = "881F4CC7-EAD4-4185-A91E-612DEFCE1E83";
        public const string InterfaceId = "F8B914CC-6696-4f5e-BD27-D77780092261";

        #region Port Settings

        #region 定义
        private SerialPort sp = new SerialPort();
        private string m_port = "COM2";
        private int m_baud = 9600;
        private int m_stopBits = 1;
        private int m_parity = 0;
        private int m_dataBits = 8;
        private string m_ComMesage;
        private bool m_ComIsOpen;

        #endregion

        #region 属性
        /// <summary>
        ///串口
        /// </summary>
        /// <returns></returns>
        public SerialPort SerialPort
        {

            get { return sp; }
            set { sp = value; }
        }
        /// <summary>
        ///端口号
        /// </summary>
        /// <returns></returns>
        public string port
        {
            get { return m_port; }
            set { m_port = value; }
        }
        /// <summary>
        ///波特率
        /// </summary>
        /// <returns></returns>
        public int baudRate
        {
            get { return m_baud; }
            set { m_baud = value; }
        }
        /// <summary>
        ///停止位
        /// </summary>
        /// <returns></returns>
        public int stopBits
        {
            get { return m_stopBits; }
            set { m_stopBits = value; }
        }
        /// <summary>
        ///奇偶校验
        /// </summary>
        /// <returns></returns>
        public int parity
        {
            get { return m_parity; }
            set { m_parity = value; }
        }
        /// <summary>
        ///字节数
        /// </summary>
        /// <returns></returns>
        public int dataBits
        {
            get { return m_dataBits; }
            set { m_dataBits = value; }
        }
        /// <summary>
        ///端口异常信息
        /// </summary>
        /// <returns></returns>
        public string ComMesage
        {
            get { return m_ComMesage; }
            set { m_ComMesage = value; }
        }
        /// <summary>
        ///端口打开状态
        /// </summary>
        /// <returns></returns>
        public bool ComIsOpen
        {
            get { return m_ComIsOpen; }
            set { m_ComIsOpen = value; }
        }
        #endregion
        #endregion
        #region Settings
        public bool IsComOpen()
        {
            return m_ComIsOpen;
        }
        /// <summary>
        ///串口通讯类 默认端口COM2 波特率9600 停止位1 奇偶校验0 数据位8
        /// </summary>
        /// <returns></returns>
        public ComHelper()
        {
            sp = new SerialPort();
            m_port = "COM2";
            m_baud = 9600;
            m_stopBits = 1;
            m_parity = 0;
            m_dataBits = 8;
            m_ComMesage = "";
            m_ComIsOpen = false;
        }
        /// <summary>
        ///串口通讯类
        /// </summary>
        /// <returns></returns>
        public ComHelper(string _port, int _baud, int _stopBits, int _databits, int _parity)
        {
            m_port = _port;
            m_baud = _baud;
            m_stopBits = _stopBits;
            m_parity = _parity;
            m_dataBits = _databits;
        }
        #endregion
        /// <summary>
        ///打开串口
        /// </summary>
        /// <returns></returns>
        public void Open(string _port, int _baud, int _stopBits, int _databits, int _parity)
        {
            m_port = _port;
            m_baud = _baud;
            m_stopBits = _stopBits;
            m_parity = _parity;
            m_dataBits = _databits;
            Open();
        }
        /// <summary>
        ///打开串口
        /// </summary>
        /// <returns></returns>
        public void Open()
        {
            if (!sp.IsOpen)
            {
                switch (m_parity)
                {
                    case 0:
                        sp.Parity = Parity.None;
                        break;
                    case 1:
                        sp.Parity = Parity.Odd;
                        break;
                    case 2:
                        sp.Parity = Parity.Even;
                        break;
                }

                switch (m_stopBits)
                {
                    case 0:
                        sp.StopBits = StopBits.None;
                        break;
                    case 1:
                        sp.StopBits = StopBits.One;
                        break;
                    case 2:
                        sp.StopBits = StopBits.OnePointFive;
                        break;
                    case 3:
                        sp.StopBits = StopBits.Two;
                        break;
                }
                sp.PortName = m_port;
                sp.BaudRate = m_baud;
                sp.DataBits = m_dataBits;
                sp.ReadTimeout = 3000;
                sp.WriteTimeout = 5000;
                try
                {
                    sp.Open();
                    ComMesage = sp.PortName + " Open the Success!";
                    sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
                }
                catch (Exception ee)
                {
                    ComMesage = "Error opening " + m_port + ": " + ee.Message;
                }
            }
            else
            {
                ComMesage = "Port Already in use by another application";
            }
            m_ComIsOpen = sp.IsOpen;
        }
        /// <summary>
        ///串口数据接收事件
        /// </summary>
        /// <returns></returns>
        public event ComEvent.DataReceivedHandler DataReceived;
        /// <summary>
        ///串口数据发送事件
        /// </summary>
        /// <returns></returns>
        public event ComEvent.DataSendHandler DataSend;
        /// <summary>
        ///关闭串口
        /// </summary>
        /// <returns></returns>
        public void Close()
        {
            if (sp.IsOpen)
            {
                try
                {
                    sp.Close();
                }
                catch (Exception err)
                {
                    ComMesage = "Error closing " + sp.PortName + ": " + err.Message;

                }
                ComMesage = sp.PortName + " closed Success";
            }
            else
            {
                ComMesage = sp.PortName + " is not open";

            }
            m_ComIsOpen = sp.IsOpen;
        }
        /// <summary>
        ///发送
        /// </summary>
        /// <returns></returns>
        public void Send(string data)
        {
            if (sp.IsOpen)
            {
                try
                {
                    data = data + "\r\n";

                    sp.WriteLine(data);
                    DataSend(data);
                    // sp.DiscardOutBuffer();
                }
                catch { }
            }
            else
            {
                ComMesage = sp.PortName + " is not open";
            }
        }
        /// <summary>
        ///读取
        /// </summary>
        /// <returns></returns>
        public string Read()
        {
            byte[] data = new byte[sp.BytesToRead];

            string buf = "";
            if (sp.IsOpen)
            {
                try
                {
                    //System.Threading.Thread.Sleep(50);
                    sp.Read(data, 0, data.Length);
                    buf = ASCIItoString(data);
                    while (buf.IndexOf("\r\n") == -1)
                    {
                        data = new byte[sp.BytesToRead];
                        sp.Read(data, 0, data.Length);
                        string temp = ASCIItoString(data);
                        buf = buf + temp;
                    }
                }
                catch (Exception eee)
                {
                    buf = sp.PortName + eee.Message;
                }
            }
            else
            {
                ComMesage = sp.PortName + " is not open";
            }
            sp.DiscardInBuffer();
            return buf;
        }
        /// <summary>
        ///ASCII码转字符
        /// <param name="string"></param>
        /// <returns></returns>
        private string ASCIItoString(byte[] asciiCode)
        {
            string aa = Encoding.ASCII.GetString(asciiCode);
            return aa;
        }
        /// <summary>
        ///去空格运算
        /// </summary>
        /// <param name="string"></param>
        /// <returns></returns>
        private string ReplaceSpace(string str)
        {
            string NewStr = null;
            string[] word = str.Split(new char[] { ‘ ‘ });
            foreach (string temp in word)
                NewStr += temp;
            return NewStr;
        }

        private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string ReDatas = Read();
            DataReceived(this, ReDatas);//输出数据
        }
    }

  

串口通讯服务类

标签:

原文地址:http://www.cnblogs.com/MachineVision/p/5775025.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!