Вы уже вызываете SP.Write (), который должен быть закрыт. Хотя вы, вероятно, не хотите отправлять имя порта обратно, отправитель мало что использует для этого. Это также не должно быть в тесте InvokeRequired. Что всегда верно, кстати, вы могли бы также удалить это.
Вы также действительно хотите избавиться от вызова Sleep (). Используйте ReadLine (), если отправитель завершает свое сообщение переводом строки ("\ n"). Если вы обдумываете это, потому что вам нужно, чтобы отправитель прекратил отправку, пока не получит подтверждение, тогда проблема real в том, что вы используете Sleep и ReadExisting.