void SendData(RequestUnit RequestUnit)
        {
            if (!IsOpen)
            {
                return;
            }
            lock (locker)
            {
                portBusy = true;
            }
            SendDataHandler senddelegate = new SendDataHandler(SendDataBody);

            senddelegate.BeginInvoke(RequestUnit, null, null);
        }
        void AddRequest(byte[] TxBuffer, int ReceivedBytesThreshold, DataRecievedRTU OnDataRecievedRTU, int RTUReadCount, RequestPriority RequestPriority, object param)
        {
            if (!IsOpen)
            {
                return;
            }


            if (RequestPriority == UniSerialPort.RequestPriority.High)
            {
                lock (locker)
                {
                    requestsMain.Enqueue(new RequestUnit(TxBuffer, ReceivedBytesThreshold, OnDataRecievedRTU, RTUReadCount, param));
                }
            }
            else
            {
                lock (locker)
                {
                    var request = new RequestUnit(TxBuffer, ReceivedBytesThreshold, OnDataRecievedRTU, RTUReadCount, param);
                    requests.Enqueue(request);
                }
            }
        }
        void SendDataBody(RequestUnit RequestUnit)
        {
            if (portError)
            {
                return;
            }
            if (serialPortMode == SerialPortModes.TCPMode)
            {
                if (RequestUnit.PortAnswerType != PortAnswerType.RTU)
                {
                    throw new Exception("Invalid request  type");
                }
            }


            if (serialPortMode == SerialPortModes.RSMode)
            {
                try
                {
                    if (serialPort.BytesToRead != 0)
                    {
                        byte[] buff = new byte[serialPort.BytesToRead + 1];
                        serialPort.Read(buff, 0, serialPort.BytesToRead);
                    }
                    Thread.Sleep(3);
                    serialPort.Write(RequestUnit.TxBuffer, 0, RequestUnit.TxBuffer.Length);
                }
                catch
                {
                    portError = true;
                    if (SerialPortError != null)
                    {
                        SerialPortError(serialPort, null);
                    }
                    return;
                }
            }

            tcpReadData = null;
            tcpWriteOk  = false;
            if (serialPortMode == SerialPortModes.TCPMode)
            {
                if (RequestUnit.GetTCPFunction() == TCPFunctions.TCPRead)
                {
                    tcpMaster.ReadHoldingRegister(1, RequestUnit.GetSlaveAddr(), RequestUnit.GetTCPStartAddr(), RequestUnit.GetTCPReadCount());
                }
                else
                {
                    tcpMaster.WriteMultipleRegister(1, RequestUnit.GetSlaveAddr(), RequestUnit.GetTCPStartAddr(), RequestUnit.GetTCPWriteData());
                }
            }

            if (serialPortMode == SerialPortModes.RSMode)
            {
                waitSerialData.WaitOne(TimeSpan.FromMilliseconds(100));

                for (int i = 0; i < 100; i++)
                {
                    if (serialPort.BytesToRead < RequestUnit.ReceivedBytesThreshold)
                    {
                        waitSerialData.WaitOne(TimeSpan.FromMilliseconds(10));
                    }
                    else
                    {
                        break;
                    }
                }
            }

            if (serialPortMode == SerialPortModes.TCPMode)
            {
                waitSerialData.WaitOne(TimeSpan.FromMilliseconds(3000));
            }

            bool dataOk = false;

            #region RecieveRS232
            if (serialPortMode == SerialPortModes.RSMode)
            {
                byte[] rxBuffer = new byte[0];

                if (serialPort.BytesToRead >= RequestUnit.ReceivedBytesThreshold)
                {
                    int count = serialPort.BytesToRead;
                    rxBuffer = new byte[count];

                    try
                    {
                        serialPort.Read(rxBuffer, 0, count);
                    }
                    catch
                    {
                        portError = true;
                        if (SerialPortError != null)
                        {
                            SerialPortError(serialPort, null);
                        }
                        return;
                    }

                    dataOk = true;
                }
                else
                {
                    // System.Windows.Forms.MessageBox.Show(RequestUnit.ReceivedBytesThreshold.ToString());
                }

                switch (RequestUnit.PortAnswerType)
                {
                case PortAnswerType.Byte:
                {
                    if (RequestUnit.DataRecieved != null)
                    {
                        RequestUnit.DataRecieved(dataOk, rxBuffer);
                    }
                    break;
                }

                case PortAnswerType.RTU:
                {
                    ushort[] ubuff = new ushort[0];

                    if (!ModBusCRC.CheckCRC(rxBuffer, rxBuffer.Length))
                    {
                        // System.Windows.Forms.MessageBox.Show("Ошибка CRC  " + rxBuffer.Length.ToString());
                        dataOk = false;
                    }
                    else
                    {
                        if (rxBuffer[1] == 0x03)
                        {
                            ModBusCRC.RemoveData(rxBuffer, 3, RequestUnit.RTUReadCount, out ubuff);
                        }
                        else
                        {
                            ubuff = new ushort[0];
                        }
                        dataOk = true;
                    }

                    if (RequestUnit.DataRecievedRTU != null)
                    {
                        RequestUnit.DataRecievedRTU(dataOk, ubuff, RequestUnit.Param);
                    }
                } break;
                }
            }
            #endregion
            #region RecieveTCP
            if (serialPortMode == SerialPortModes.TCPMode)
            {
                if (RequestUnit.GetTCPFunction() == TCPFunctions.TCPRead)
                {
                    dataOk = (tcpReadData != null);
                    ushort[] us = new ushort[0];
                    if (dataOk)
                    {
                        ModBusCRC.RemoveData(tcpReadData, 0, RequestUnit.RTUReadCount, out us);
                    }
                    if (RequestUnit.DataRecievedRTU != null)
                    {
                        RequestUnit.DataRecievedRTU(dataOk, us, RequestUnit.Param);
                    }
                }
                else
                {
                    ushort[] us = new ushort[0];
                    if (RequestUnit.DataRecievedRTU != null)
                    {
                        RequestUnit.DataRecievedRTU(tcpWriteOk, us, RequestUnit.Param);
                    }
                }
            }
            #endregion

            lock (locker)
            {
                bool b = CheckQueue(false);
                portBusy = b;
            }
        }