ДОБРО ПОЖАЛОВАТЬ В ВОЛШЕБНЫЙ МИР МНОГОПРОЧНОГО !!!
Что происходит, так это то, что все ваши элементы пользовательского интерфейса (экземпляры классов) могут быть доступны / обновлены только потоком пользовательского интерфейса. Я не буду вдаваться в подробности об этой близости темы, но это важная тема, и вы должны проверить это.
Событие, когда данные поступают через последовательный порт, происходит в потоке , отличном от потока пользовательского интерфейса . В потоке пользовательского интерфейса есть насос сообщений, который обрабатывает сообщения Windows (например, щелчки мыши и т. Д.). Ваш последовательный порт не отправляет сообщения Windows. Когда данные поступают на последовательный порт, для обработки этого сообщения используется совершенно другой поток из потока пользовательского интерфейса.
Итак, в вашем приложении метод mSerialPort_DataReceived выполняется в потоке, отличном от потока вашего пользовательского интерфейса. Вы можете использовать окно отладки Threads, чтобы проверить это.
Когда вы пытаетесь обновить свой пользовательский интерфейс, вы пытаетесь изменить элемент управления с привязкой потока для потока пользовательского интерфейса из другого потока, который выдает исключение, которое вы видели.
TL; DR: вы пытаетесь изменить элемент пользовательского интерфейса вне потока пользовательского интерфейса. Используйте
txtSerialOutput.Dispatcher.Invoke
чтобы запустить обновление в потоке пользовательского интерфейса. Здесь приведен пример того, как это сделать, в контенте сообщества на этой странице.
Диспетчер вызовет ваш метод в потоке пользовательского интерфейса (он отправляет оконное сообщение в пользовательский интерфейс со словами «Привет, гайзер, запустите этот метод kthx»), и ваш метод сможет безопасно обновить пользовательский интерфейс из потока пользовательского интерфейса.