Я предполагаю, что вы закрываете соединение с помощью sp.Dispose ()? В настоящее время это закомментировано в вашем коде. Обычно вы хотите использовать Close () - он отбрасывает как входной, так и выходной буферы.
Но я думаю, что вы, возможно, получаете данные, и событие DataReceived запускается, но не обязательно доставляется, когда вы выполняете Dispose. Когда он доставлен, ваш последовательный порт sp уже удален, поэтому я подозреваю, что вы получаете ошибку sp.ReadTo () в вашей функции serialReceived (). На самом деле, при ближайшем рассмотрении, когда (если) вы делаете Close (), вы получите еще одно событие - указание «конец файла» вызовет событие DataReceived.
Вы можете установить sp = null после удаления, а затем проверить это в функции serialReceived () перед чтением. В любом случае, это хорошая практика. Как вы, вероятно, знаете, событие DataReceived будет запускать serialReceived в другом потоке. Я не уверен, может ли это быть запланировано ранее между вызовом Dispose () и sp = null.
Итак, я думаю, что лучше всего отключить событие перед вызовом Close ():
sp.DataReceived += serialReceived.
Другое дело - я раньше не использовал ReadTo (), но похоже, что он будет блокироваться, пока этот символ не будет получен. Это то, что вы ожидаете? Если персонаж входит, ваше событие будет запущено, но этот поток будет блокироваться до тех пор, пока не будет получено «#». Я думаю, что более типичный обработчик событий DataReceived будет читать и обрабатывать все доступные байты и анализировать его.