title: Serial Port ReadLine vs ReadExisting or how to read the data from serial port properly
body: <p>I am reading data from serial port. The data comes off the scale. I am now using <code>Readline()</code> and getting data dropped even after I removed <code>DiscardInBuffer()</code>. </p>
  
  <p>What is the proper way to read the data from the serial port? There are so few examples online that I feel it's like some holy grail that no one has figured out.</p>
  
  <p>C#, WinCE 5.0, HP thin client, Compact framework 2.0</p>
  
  <pre><code> private void WeighSample()
      {
          this._processingDone = false;
          this._workerThread = new Thread(CaptureWeight);
          this._workerThread.IsBackground = true;
          this._workerThread.Start();
      } //end of WeighSample()
  
  
      private void CaptureWeight()
      {
           globalCounter++;
           string value = "";
  
  
            while (!this._processingDone)
            {
                try
                {
  
                   value = this._sp.ReadLine();
  
                    if (value != "")
                    {
                        if (value == "ES")
                        {
                            _sp.DiscardInBuffer();
                            value = "";
                        }
                        else
                        {
                            this.Invoke(this.OnDataAcquiredEvent, new object[] { value });
                        }
                    }
                }
                catch (TimeoutException)
                {
                    //catch it but do nothing
                }
                catch
                {
                    //reset the port here?
                    MessageBox.Show("some other than timeout exception thrown while reading serial port");
                }
            }
  
  
      } //end of CaptureWeight()
  </code></pre>
  
  <p>One thing to note about my application is that I start the thread (weighSample) when the cursor jumps onto the textbox. The reason to this is that the weight can also be typed in manually (part of the requirements). So I don't know in advance whether a user is going to press PRINT on the balance or type the weight. In either case after the data is acquired, I exit the worker thread. Also, note that I am not using serial port event DataReceived, since I have been told it's not reliable.</p>
  
  <p>This is my first experience with serial ports.</p>