C#串口操作類,包括串口讀寫操作

串口進行操作的類,其中包括寫和讀操作,類可設置串口參數、設置接收函數、打開串口資源、關閉串口資源,操作完成後,一定要關閉串口、接收串口數據事件、接收數據出錯事件、獲取當前全部串口、把字節型轉換成十六進制字符串等功能。這個串口類已經過了調試,可以使用:

 

using System;

using System.Collections.Generic;

using System.Text;

using System.IO.Ports;

using System.Globalization;

namespace SerialClass

{

    public class SerialClass

    {

        SerialPort _serialPort = null;

        //定義委託

        public delegate void SerialPortDataReceiveEventArgs(object sender, SerialDataReceivedEventArgs e, byte[] bits);

        //定義接收數據事件

        public event SerialPortDataReceiveEventArgs DataReceived;

        //定義接收錯誤事件

        //public event SerialErrorReceivedEventHandler Error;

        //接收事件是否有效 false表示有效

        public bool ReceiveEventFlag = false;

        #region 獲取串口名

        private string protName;

        public string PortName

        {

            get { return _serialPort.PortName; }

            set

            {

                _serialPort.PortName = value;

                protName = value;

            }

        }

        #endregion

        #region 獲取比特率

        private int baudRate;

        public int BaudRate

        {

            get { return _serialPort.BaudRate; }

            set

            {

                _serialPort.BaudRate = value;

                baudRate = value;

            }

        }

        #endregion

        #region 默認構造函數

        /// <summary>

        /// 默認構造函數,操作COM1,速度爲9600,沒有奇偶校驗,8位字節,停止位爲1 "COM1", 9600, Parity.None, 8, StopBits.One

        /// </summary>

        public SerialClass()

        {

            _serialPort = new SerialPort();

        }

        #endregion

        #region 構造函數

        /// <summary>

        /// 構造函數,

        /// </summary>

        /// <param name="comPortName"></param>

        public SerialClass(string comPortName)

        {

            _serialPort = new SerialPort(comPortName);

            _serialPort.BaudRate = 9600;

            _serialPort.Parity = Parity.Even;

            _serialPort.DataBits = 8;

            _serialPort.StopBits = StopBits.One;

            _serialPort.Handshake = Handshake.None;

            _serialPort.RtsEnable = true;

            _serialPort.ReadTimeout = 2000;

            setSerialPort();

        }

        #endregion

        #region 構造函數,可以自定義串口的初始化參數

        /// <summary>

        /// 構造函數,可以自定義串口的初始化參數

        /// </summary>

        /// <param name="comPortName">需要操作的COM口名稱</param>

        /// <param name="baudRate">COM的速度</param>

        /// <param name="parity">奇偶校驗位</param>

        /// <param name="dataBits">數據長度</param>

        /// <param name="stopBits">停止位</param>

        public SerialClass(string comPortName, int baudRate, Parity parity, int dataBits, StopBits stopBits)

        {

            _serialPort = new SerialPort(comPortName, baudRate, parity, dataBits, stopBits);

            _serialPort.RtsEnable = true;  //自動請求

            _serialPort.ReadTimeout = 3000;//超時

            setSerialPort();

        }

        #endregion

        #region 析構函數

        /// <summary>

        /// 析構函數,關閉串口

        /// </summary>

        ~SerialClass()

       {

           if (_serialPort.IsOpen)

               _serialPort.Close();

       }

        #endregion

        #region 設置串口參數

        /// <summary>

        /// 設置串口參數

        /// </summary>

        /// <param name="comPortName">需要操作的COM口名稱</param>

        /// <param name="baudRate">COM的速度</param>

        /// <param name="dataBits">數據長度</param>

        /// <param name="stopBits">停止位</param>

        public void setSerialPort(string comPortName, int baudRate, int dataBits, int stopBits )

        {

            if (_serialPort.IsOpen)

                _serialPort.Close();

            _serialPort.PortName = comPortName;

            _serialPort.BaudRate = baudRate;

            _serialPort.Parity = Parity.None;

            _serialPort.DataBits = dataBits;

            _serialPort.StopBits = (StopBits)stopBits;

            _serialPort.Handshake = Handshake.None;

            _serialPort.RtsEnable = false;

            _serialPort.ReadTimeout = 3000;

            _serialPort.NewLine = "/r/n";

            setSerialPort();

        }

        #endregion

        #region 設置接收函數

        /// <summary>

        /// 設置串口資源,還需重載多個設置串口的函數

        /// </summary>

        void setSerialPort()

        {

            if (_serialPort != null)

            {

                //設置觸發DataReceived事件的字節數爲1

                _serialPort.ReceivedBytesThreshold = 1;

                //接收到一個字節時,也會觸發DataReceived事件

                _serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived);

                //接收數據出錯,觸發事件

                _serialPort.ErrorReceived += new SerialErrorReceivedEventHandler(_serialPort_ErrorReceived);

                //打開串口

                //openPort();

            }

        }

        #endregion

        #region 打開串口資源

        /// <summary>

        /// 打開串口資源

        /// <returns>返回bool類型</returns>

        /// </summary>

        public bool openPort()

        {

            bool ok = false;

            //如果串口是打開的,先關閉

            if (_serialPort.IsOpen)

                _serialPort.Close();

            try

            {

                //打開串口

                _serialPort.Open();

                ok = true;

            }

            catch (Exception Ex)

            {

                throw Ex;

            }

            return ok;

        }

        #endregion

        #region 關閉串口

        /// <summary>

        /// 關閉串口資源,操作完成後,一定要關閉串口

        /// </summary>

        public void closePort()

        {

            //如果串口處於打開狀態,則關閉

            if (_serialPort.IsOpen)

                _serialPort.Close();

        }

        #endregion

        #region 接收串口數據事件

        /// <summary>

        /// 接收串口數據事件

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)

        {

            //禁止接收事件時直接退出

            if (ReceiveEventFlag)

            {

                return;

            }

            try

            {

                    System.Threading.Thread.Sleep(20);

                    byte[] _data = new byte[_serialPort.BytesToRead];

                    _serialPort.Read(_data, 0, _data.Length);

                    if (_data.Length == 0) { return; }

                    if (DataReceived != null)

                    {    

                        DataReceived(sender, e, _data);

                    }

                    //_serialPort.DiscardInBuffer();  //清空接收緩衝區  

            }

            catch (Exception ex)

            {

                throw ex;

            }

        }

        #endregion

        #region 接收數據出錯事件

        /// <summary>

        /// 接收數據出錯事件

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        void _serialPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)

        {

        }

        #endregion

        #region 發送數據string類型

        public void SendData(string data)

        {

            //發送數據

            //禁止接收事件時直接退出

            if (ReceiveEventFlag)

            {

                return;

            }

            if (_serialPort.IsOpen)

            {

                _serialPort.Write(data);

            }

        }

        #endregion

        #region 發送數據byte類型

        /// <summary>

        /// 數據發送

        /// </summary>

        /// <param name="data">要發送的數據字節</param>

        public void SendData(byte[] data, int offset, int count)

        {

            //禁止接收事件時直接退出

            if (ReceiveEventFlag)

            {

                return;

            }

            try

            {

                if (_serialPort.IsOpen)

                {

                    //_serialPort.DiscardInBuffer();//清空接收緩衝區

                    _serialPort.Write(data, offset, count);

                }

            }

            catch (Exception ex)

            {

                throw ex;

            }

        }

        #endregion

        #region 發送命令

        /// <summary>

        /// 發送命令

        /// </summary>

        /// <param name="SendData">發送數據</param>

        /// <param name="ReceiveData">接收數據</param>

        /// <param name="Overtime">超時時間</param>

        /// <returns></returns>

        public int SendCommand(byte[] SendData, ref  byte[] ReceiveData, int Overtime)

        {

 

            if (_serialPort.IsOpen)

            {

                try

                {

                    ReceiveEventFlag = true;        //關閉接收事件

                    _serialPort.DiscardInBuffer();  //清空接收緩衝區                

                    _serialPort.Write(SendData, 0, SendData.Length);

                    int num = 0, ret = 0;

                    System.Threading.Thread.Sleep(10);

                    ReceiveEventFlag = false;      //打開事件

                    while (num++ < Overtime)

                    {

                        if (_serialPort.BytesToRead >= ReceiveData.Length)

                            break;

                        System.Threading.Thread.Sleep(10);

                    }

 

                    if (_serialPort.BytesToRead >= ReceiveData.Length)

                    {

                        ret = _serialPort.Read(ReceiveData, 0, ReceiveData.Length);

                    }

                    else

                    {

                        ret = _serialPort.Read(ReceiveData, 0, _serialPort.BytesToRead);

                    }

                    ReceiveEventFlag = false;      //打開事件

                    return ret;

                }

                catch (Exception ex)

                {

                    ReceiveEventFlag = false;

                    throw ex;

                }

            }

            return -1;

        }

        #endregion

        #region 獲取串口

        /// <summary>

        /// 獲取所有已連接短信貓設備的串口

        /// </summary>

        /// <returns></returns>

        public string[] serialsIsConnected()

        {

            List<string> lists = new List<string>();

            string[] seriallist = getSerials();

            foreach (string s in seriallist)

            {

            }

            return lists.ToArray();

        }

        #endregion

        #region 獲取當前全部串口資源

        /// <summary>

        /// 獲得當前電腦上的所有串口資源

        /// </summary>

        /// <returns></returns>

        public string[] getSerials()

        {

string[] ports = SerialPort.GetPortNames();

            Array.Sort(ports);

            return ports;

        }

        #endregion

        #region 字節型轉換16

        /// <summary>

        /// 把字節型轉換成十六進制字符串

        /// </summary>

        /// <param name="InBytes"></param>

        /// <returns></returns>

        public static string ByteToString(byte[] InBytes)

        {

            string StringOut = "";

            foreach (byte InByte in InBytes)

            {

                StringOut = StringOut + String.Format("{0:X2} ", InByte);

            }

            return StringOut;

        }

        #endregion

        #region 十六進制字符串轉字節型

        /// <summary>

        /// 把十六進制字符串轉換成字節型(方法1)

        /// </summary>

        /// <param name="InString"></param>

        /// <returns></returns>

        public static byte[] StringToByte(string InString)

        {

            string[] ByteStrings;

            ByteStrings = InString.Split(" ".ToCharArray());

            byte[] ByteOut;

            ByteOut = new byte[ByteStrings.Length];

            for (int i = 0; i <= ByteStrings.Length-1 ; i++)

            {

                //ByteOut[i] = System.Text.Encoding.ASCII.GetBytes(ByteStrings[i]);

                ByteOut[i] = Byte.Parse(ByteStrings[i], System.Globalization.NumberStyles.HexNumber);

                //ByteOut[i] =Convert.ToByte("0x" + ByteStrings[i]);

            }

            return ByteOut;

        }

        #endregion

        #region 十六進制字符串轉字節型

        /// <summary>

        /// 字符串轉16進制字節數組(方法2)

        /// </summary>

        /// <param name="hexString"></param>

        /// <returns></returns>

        public static byte[] strToToHexByte(string hexString)

        {

            hexString = hexString.Replace(" ", "");

            if ((hexString.Length % 2) != 0)

                hexString += " ";

            byte[] returnBytes = new byte[hexString.Length / 2];

            for (int i = 0; i < returnBytes.Length; i++)

                returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);

            return returnBytes;

        }

        #endregion

        #region 字節型轉十六進制字符串

        /// <summary>

        /// 字節數組轉16進制字符串

        /// </summary>

        /// <param name="bytes"></param>

        /// <returns></returns>

        public static string byteToHexStr(byte[] bytes)

        {

            string returnStr = "";

            if (bytes != null)

            {

                for (int i = 0; i < bytes.Length; i++)

                {

                    returnStr += bytes[i].ToString("X2");

                }

            }

            return returnStr;

        }

        #endregion

    }

}

 

======================================================================================

調用方法:

static SerialClass sc = new SerialClass();

static void Main(string[] Args)

{

   sc.DataReceived += new SerialClass.SerialPortDataReceiveEventArgs(sc_DataReceived);

   sc.writeData("at");

   Console.ReadLine();

   sc.closePort();

}

static void sc_DataReceived(object sender, SerialDataReceivedEventArgs e, byte[] bits)

{

   Console.WriteLine(Encoding.Default.GetString(bits));

}

 

原文地址:http://www.cnblogs.com/netlyf/p/4458927.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章