This is a robust approach:
private SerialPort _serialPort;
_serialPort = new SerialPort();
_serialPort.Open();
_serialPort.DataReceived += dataReceivedHandler;
private void dataReceivedHandler(object sender, SerialDataReceivedEventArgs args)
{
if (!_serialPort.IsOpen)
return;
int BytesToRead = _serialPort.BytesToRead;
byte[] data = new byte[BytesToRead];
int NumBytes = _serialPort.Read(data, 0, BytesToRead);
String mystring = Encoding.ASCII.GetString(data, 0, NumBytes);
}