Во-первых, добро пожаловать.
Перед «большой» проблемой (сортировка данных), позвольте мне предупредить вас - последовательные порты хитры.Например, ваш вызов «ReadExisting» может не вернуть того, что вы ожидаете, - он вернет все, что находится в буфере последовательного порта во время , но может появиться больше, что перезапишет то, что уже находится в вашемтекстовое окно.Так что вы можете добавить данные вашего текстового поля.
Теперь реальная проблема.Как уже упоминалось, комментатор не может публиковать данные из другой ветки непосредственно в ветке пользовательского интерфейса.Без вашего ведома, последовательный порт создал новый поток для получения данных.
Вы можете справиться с этим напрямую, изменив код получателя следующим образом:
public void mySerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort) sender;
var dataRcvd = sp.ReadExisting();
object[] dataArray = new object[1];
dataArray[0] = dataRcvd;
BeginInvoke( new postDataDelegate( postData), dataArray );
}
private delegate void postDataDelegate( string d );
private void postData( string d)
{
textBox4.Text = d;
}
Это «маршаллизирует» данныев поток пользовательского интерфейса, чтобы его можно было использовать.Есть много способов сделать это (и есть много различий между тем, как это делается в WPF и Winforms, так что следите за этим).Я надеюсь, что это иллюстрирует эту мысль.
Еще одно замечание - нет необходимости делать метод DataReceived общедоступным - он будет отлично работать в частном порядке.