COM串口通讯基类

2022-11-17--代码优化
2019-08-02--提高串口接收方法效率
2019-06-26--代码优化
2018-11-27--添加字节数组合并方法
2018-08-11--优化串口接收速度
2018-04-28--优化串口接收数据
转载请保留原创地址:http://www.luofenming.com/show.aspx?id=ART2017121500002
public class SerialCommon
{
    public string[] portName = SerialPort.GetPortNames();//获取当前计算机的串行端口名称数组
    public SerialPort MySerialPort = new SerialPort();

    /// <summary>
    /// 初始化串口
    /// </summary>
    /// <param name="PortName">串口号</param>
    /// <param name="BaudRate">波特率</param>
    /// <param name="DataBits">数据位</param>
    /// <param name="stopBits">停止位</param>
    /// <param name="parity">奇偶校验</param>
    public bool InitComm(string PortName, int BaudRate, int DataBits, StopBits stopBits, Parity parity)
    {
        try
        {
            if (MySerialPort.IsOpen)
            {
                MySerialPort.Close();
            }
            MySerialPort.PortName = PortName;
            MySerialPort.BaudRate = BaudRate;
            MySerialPort.DataBits = DataBits;
            MySerialPort.StopBits = stopBits;
            MySerialPort.Parity = parity;
            return true;
        }
        catch
        {
            return false;
        }
    }

    public bool OpenPort()
    {
        try
        {
            if (!MySerialPort.IsOpen)
            {
                MySerialPort.Open();
            }
        }
        catch (Exception ex)
        {
            return false;
        }
        return true;
    }
    public bool ClosePort()
    {
        try
        {
            if (MySerialPort != null)
                MySerialPort.Close();
        }
        catch (Exception ex)
        {
            return false;
        }
        return true;
    }

    /// <summary>
    /// 发送数据
    /// </summary>
    /// <param name="data"></param>
    public bool SendData(byte[] data)
    {
        if (MySerialPort.IsOpen)
        {
            try
            {
                MySerialPort.DiscardInBuffer();
                MySerialPort.DiscardOutBuffer();
                MySerialPort.Write(data, 0, data.Length);
                return true;
            }
            catch (Exception ex)
            {
            }
        }
        return false;
    }
    /// <summary>
    /// 接收数据
    /// </summary>
    /// <param name="_Timeout"></param>
    /// <returns></returns>
    public byte[] ReceiveData(int _Timeout)
    {
        byte[] buffer = new byte[] { };
        DateTime t = DateTime.Now;
        try
        {
            #region 接收到数据中断 或 在规定时间内无任何数据中断
            while (true)
            {
                if (MySerialPort.BytesToRead > 0) { break; }
                if (DateTime.Compare(DateTime.Now, t.AddMilliseconds(_Timeout)) > 0) { break; }
                Thread.Sleep(5);
            }
            #endregion
            while (true)
            {
                Thread.Sleep(50);
                int n = MySerialPort.BytesToRead;
                byte[] buf = new byte[n];
                if (n < 1) { break; }//无数据中断退出
                MySerialPort.Read(buf, 0, n);
                buffer = UniteArray(buffer, buf);
                if (DateTime.Compare(DateTime.Now, t.AddMilliseconds(_Timeout)) > 0)
                {
                    break;
                }
            }
            return buffer;
        }
        catch (Exception ex)
        {
            return buffer;
        }
    }
    ///合并数组
    public byte[] UniteArray(byte[] ArrayMain, byte[] ArrayItme)
    {
        if (ArrayMain == null) { return ArrayItme; }
        if (ArrayItme == null) { return ArrayMain; }
        byte[] val = new byte[ArrayMain.Length + ArrayItme.Length];
        for (int i = 0; i < val.Length; i++)
        {
            if (i < ArrayMain.Length)
            {
                val[i] = ArrayMain[i];
            }
            else
            {
                val[i] = ArrayItme[i - ArrayMain.Length];
            }
        }
        return val;
    }
}