Связь на аппаратных устройствах, таких как жесткие диски, сетевые порты и, да, последовательные порты, осуществляется с использованием потока завершения ввода-вывода, управляемого ThreadPool. Итак, краткий ответ на ваш вопрос заключается в том, что данные должны приниматься портом, даже если ваша программа не запущена и активно ее ожидает. Когда ваш поток проснется, он спросит у порта, сколько байтов находится в буфере, и ответит, что у него еще 5 байтов, чем до того, как вы спали в потоке.