Re[3]: Что определяет ReadTimeout SerialPort?
От: curvex Россия  
Дата: 02.01.07 16:33
Оценка: 3 (1)
Здравствуйте, Andrej-V, Вы писали:

AV>Остаютсяся два независимых друг от друга вопроса (оба вопроса относятся к состоянию, когда модем включен).

AV>1. Как порт определяет, что получен весь ответ (а не часть его). Т.е. как он определяет, что можно позволить программе выполняться не выжидая время записанное в свойстве ReadTimeout.

Беглый взгляд на код SerialPort посредством рефлектора показал, что он реализован через overlapped i/o при работе на Windows NT и выше. То есть пытается прочесть хоть сколько-нибудь байт из устройства и возвращает их пользователю. Остальные принятые данные кэшируется во внутреннем буфере класса до следующего вызова метода Read.
При этом ReadTimeout определяет, сколько времени класс SerialPort будет ждать хотя бы один байт от устройства, а не все заправшиваемые данные.

AV>2. Почему время получения ответа на команду ATZ (команда инициализации модема) — 0. Ведь инициализация — процесс не мгновенный. Thread.Sleep(500);, которое записано после com.Write("ATZ\r\n"); на это время не влияет ( можно закомментировать, — все равно 0).


Тут тоже все просто, данные поступающие из устройства кэшируются драйвером, независимо от состояния Вашего потока. Т.е. когда ваш поток спал в результате вызова Sleep, драйвер прочитал ответ модема. Модем вполне мог уложиться в 500 миллисекунд. Когда поток проснулся, драйвер сразу же вернул ему ранее прочитанные данные. Время обмена между Вашим потоком и драйвером заметно меньше разрешения таймера, используемого для измерения интервала, потому он и был определен как 0.

Вообще, подозреваю, что данный топик имеет очень отдаленное отношение к .NET, лучше его продолжить в Низкоуровневом программировании...

Успехов,
Леонид.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.