correggo il precedente, in effetti nel caso 2) c'era una stupidaggine mia.
Tutto funziona con il seguente codice che include anche il controllo sulla terminazione della stringa:
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
m_buffer += serialPort.ReadExisting();
if (m_buffer.Length >= 2 && m_buffer.Substring(m_buffer.Length-2,2)=="\r\n")
{
this.Invoke((Action)delegate
{
this.txtSerialText.Text += m_buffer;
});
m_buffer = string.Empty;
}
if (!(serialPort.IsOpen))
serialPort.Open();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "");
}
}