title: Serial Port Communication missing one byte
body: <p>I'm responsible for creating a HMI which will use the USB port to communicate with the device.</p>
  
  <p>I'm new to C# and WPF, so I started researching a bit and found several questions and topics in this site which helped me achieve the starting point I wanted: I'm able to read and write to the SerialPort class.</p>
  
  <p>To test the device I have a UART that echoes back any message it receives. I have a simple form with a text box, a button and a label. Once the button is clicked it sends the text typed in the box to the device (if no text is entered I have a pre defined array of bytes to test). The label is update anytime the port receives bytes.</p>
  
  <p>The code runs ok for the first message (doesn't matter which), but any message sent after that almost always comes back with missing bytes. I have no clue as to why this is happening, I tried discarding the buffers every time, but to no avail.</p>
  
  <p>Here's my code:</p>
  
  <pre><code>using System.IO.Ports;
  
  namespace LearningSteps
  {
      /// &lt;summary&gt;
      /// Interaction logic for Comm.xaml
      /// &lt;/summary&gt;
      /// 
      public partial class Comm : Window
      {
          SerialPort port;
          BackgroundWorker backgroundWorker1 = new BackgroundWorker();
  
          public delegate void AtualizaCallBack(string message);
  
          public Comm()
          {
              InitializeComponent();
              //InitializeBackgroundWorker();
              port = new SerialPort("COM4",115200,Parity.None,8,StopBits.One);
              port.RtsEnable = true;
              port.DataReceived +=
              new SerialDataReceivedEventHandler(Recebido);
              port.Open();
  
          }
  
          private void Recebido(object sender, SerialDataReceivedEventArgs e)
          {
              SerialPort sp = (SerialPort)sender;
              String indata = sp.ReadExisting();
  
              sp.DiscardOutBuffer();
              sp.DiscardInBuffer();
  
              my_label.Dispatcher.Invoke(new AtualizaCallBack(this.atualiza),new object[]{indata});
  
          }
  
          private void bt_Click(object sender, RoutedEventArgs e)
          {
              if (txt1.Text.Length == 0)
              {
                  byte[] vetor = new byte[] { 0x40, 0x45, 0x2B, 0x5C, 0x10 };
                  port.DiscardOutBuffer();
                  port.Write(vetor, 0, 5);
              }
              else
              {
                  port.DiscardOutBuffer();
                  port.Write(txt1.Text);
              }
          }
  
          private void atualiza(string s)
          {
              my_label.Content = s;
          }
  
      }
  }
  </code></pre>
  
  <p>And here's the XAML:</p>
  
  <pre><code>&lt;Window x:Class="LearningSteps.Comm"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          Title="Comm" Height="346" Width="404"&gt;
      &lt;Grid Background="#FF9E9E9E"&gt;
          &lt;Label x:Name="my_label" HorizontalAlignment="Left" Height="40" Margin="80,200,0,0" VerticalAlignment="Top" Width="240" Background="#FFD1D18D" FontSize="14" FontWeight="Bold" Foreground="#FF1D83BD" HorizontalContentAlignment="Center" Content="Lalala"/&gt;
          &lt;TextBox x:Name="txt1" HorizontalAlignment="Left" Height="40" Margin="80,80,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="240" TextAlignment="Center" FontSize="14" FontWeight="Bold"/&gt;
          &lt;Button x:Name="bt" Content="Enviar" HorizontalAlignment="Left" Height="40" Margin="140,140,0,0" VerticalAlignment="Top" Width="120" FontWeight="Bold" Foreground="#FF4084BD" Click="bt_Click"&gt;
              &lt;Button.Background&gt;
                  &lt;LinearGradientBrush EndPoint="0,1" StartPoint="0,0"&gt;
                      &lt;GradientStop Color="#FFF3F3F3" Offset="0"/&gt;
                      &lt;GradientStop Color="#FFE6C041"/&gt;
                      &lt;GradientStop Color="#FFE8C382" Offset="1"/&gt;
                  &lt;/LinearGradientBrush&gt;
              &lt;/Button.Background&gt;
          &lt;/Button&gt;
      &lt;/Grid&gt;
  &lt;/Window&gt;
  </code></pre>
  
  <p>Any ideas of what might be the problem here?</p>