/// <summary>
        ///  Command code 42:  Single discrete control.
        /// </summary>
        /// <param name="slaveStationNo">Slave Station No</param>
        /// <param name="cmmdCode">Command Code</param>
        /// <param name="runCode">Running Code</param>
        /// <param name="mType">Memory Type</param>
        /// <param name="discreteNo">Discrete No</param>
        /// <param name="dType">Data Type</param>
        public void WriteSingleDiscrete(int slaveStationNo, CommandCode cmmdCode, RunningCode runCode, MemoryType mType, ushort discreteNo, DataType dType)
        {
            try
            {
                string frame = this.GetMessageWriteSingleDiscrete(slaveStationNo, cmmdCode, runCode, mType, discreteNo, dType);
                objSerialPort.WriteLine(frame);

                // Read SerialPort
                int      sizeOfMessageReceiver = 9;
                string   buffReceiver          = string.Empty;
                DateTime startDateTime         = DateTime.Now;
                do
                {
                    this.CheckBufferReceiver(buffReceiver);
                    buffReceiver = objSerialPort.ReadExisting();
                    System.Threading.Thread.Sleep(100);
                } while (buffReceiver.Length < sizeOfMessageReceiver && (DateTime.Now.Subtract(startDateTime).TotalMilliseconds < objSerialPort.ReadTimeout));
                string errorMsg = this.GetException(buffReceiver);
                if (!string.IsNullOrEmpty(errorMsg) || !string.IsNullOrWhiteSpace(errorMsg))
                {
                    throw new Exception(errorMsg);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        ///  Command code 42:  Single discrete control.
        /// </summary>
        /// <param name="slaveStationNo">Slave Station No</param>
        /// <param name="cmmdCode">Command Code</param>
        /// <param name="runCode">Running Code</param>
        /// <param name="mType">Memory Type</param>
        /// <param name="discreteNo">Discrete No</param>
        /// <param name="dType">Data Type</param>
        /// <returns>string</returns>
        public string GetMessageWriteSingleDiscrete(int slaveStationNo, CommandCode cmmdCode, RunningCode runCode, MemoryType mType, ushort discreteNo, DataType dType)
        {
            string frame = string.Format("{0:X2}", slaveStationNo); // Slave station no.

            frame += string.Format("{0:X2}", (byte)cmmdCode);       // Command no.
            frame += string.Format("{0}", (byte)runCode);           // Runiing code.
            switch (dType)
            {
            case DataType.BOOL:
                frame += string.Format("{0}{1:X4}", mType, discreteNo);     // Discrete No.
                break;

            default:
                throw new InvalidOperationException("Data type is invalid");
            }
            frame += CheckSum(frame);
            return(Convert.ToChar(STX) + frame + Convert.ToChar(EXT));
        }