C>Беглый взгляд на код SerialPort посредством рефлектора показал, что он реализован через overlapped i/o при работе на Windows NT и выше. То есть пытается прочесть хоть сколько-нибудь байт из устройства и возвращает их пользователю. Остальные принятые данные кэшируется во внутреннем буфере класса до следующего вызова метода Read.
Спасибо.
А как в NET SerialPort определяет сколько байт прочитать: один, два, десять?
Без этого знания невозможно написать программу обмена данными с портом.
AV>>2. Почему время получения ответа на команду ATZ (команда инициализации модема) — 0. Ведь инициализация — процесс не мгновенный. Thread.Sleep(500);, которое записано после com.Write("ATZ\r\n"); на это время не влияет ( можно закомментировать, — все равно 0).
C>Тут тоже все просто, данные поступающие из устройства кэшируются драйвером, независимо от состояния Вашего потока. Т.е. когда ваш поток спал в результате вызова Sleep, драйвер прочитал ответ модема. Модем вполне мог уложиться в 500 миллисекунд. Когда поток проснулся, драйвер сразу же вернул ему ранее прочитанные данные. Время обмена между Вашим потоком и драйвером заметно меньше разрешения таймера, используемого для измерения интервала, потому он и был определен как 0.
Драйвер модема не гружу (работаю с модемом напрямую через порт). Thread.Sleep(500); — закомментировал. Время получения ответа — 0;
Программка простая. Может попробуете, если есть немного времени и модем?
C>Вообще, подозреваю, что данный топик имеет очень отдаленное отношение к .NET, лучше его продолжить в Низкоуровневом программировании...
???
Так я ж на C# программирую. Вопросы по работе с SerialPort. Вникать в низкоуровнее программирование порта — бросает в дрожь.