///////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// Syncronous Send.  Sends a Esys protocol message over the serial port and waits for
        /// the response.  Returns the reponse if successful, null otherwise.
        /// </summary>
        ///////////////////////////////////////////////////////////////////////////////////////////
        private Message Send(Message message, int timeout)
        {
            if (Connected) {
                lock (mSyncLock) {
                    Esys.Protocol.Message result = null;
                    int count = timeout / 20;
                    mResult = null;
                    mMsgNumber = (mMsgNumber >= 99999) ? 1 : mMsgNumber + 1;
                    message.Number = mMsgNumber;
                    mPort.Write(message.ToString());

                    for (int i = 0; i < count; i++) {
                        result = mResult;
                        if (result != null && result.Number == message.Number && result is Message) {
                            break;
                        } else {
                            result = null;
                            Thread.Sleep(20);
                        }
                    }

                    return (Message)result;
                }
            } else {
                return null;
            }
        }
 ///////////////////////////////////////////////////////////////////////////////////////////
 /// <summary>
 /// Event handler called when data is received on the serial port (mPort)
 /// </summary>
 ///////////////////////////////////////////////////////////////////////////////////////////
 private void mPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
 {
     Message result = new Message();
     string endchar = ASCIIEncoding.ASCII.GetString(new byte[] { 0x03 });
     try {
         string data = mPort.ReadTo(endchar);
         data = data.Remove(0, 1); //Remove the start char
         if (result.TryParse(data)) {
             mResult = result;
         }
     } catch {
         //ArgumentException             -The length of the value parameter is 0.
         //ArgumentNullException         -The value parameter is nullNothingnullptra null reference (Nothing in Visual Basic).
         //InvalidOperationException     -The specified port is not open.
         //TimeoutException              -The operation did not complete before the time-out period ended.
     }
 }