Остаютсяся два независимых друг от друга вопроса (оба вопроса относятся к состоянию, когда модем включен).
1. Как порт определяет, что получен весь ответ (а не часть его). Т.е. как он определяет, что можно позволить программе выполняться не выжидая время записанное в свойстве ReadTimeout.
(Свойство ReadTimeout есть и у Stream, но как оно там работает (интуичит что все данные отправлены или нет) в MSDN, кажется, не написано.)
2. Почему время получения ответа на команду ATZ (команда инициализации модема) — 0. Ведь инициализация — процесс не мгновенный. Thread.Sleep(500);, которое записано после com.Write("ATZ\r\n"); на это время не влияет ( можно закомментировать, — все равно 0).