Здравствуйте, curvex, Вы писали:
AV>>А как в NET SerialPort определяет сколько байт прочитать: один, два, десять?
C>Думаю, что никак.
Я предполагал, что как-то используется какое-то время считывания или считывается определенное кол-во байт. Но или алгоритм более сложный (непонятно зачем) или определяется во время считывания какая-то другая величина (например, заканчивается время обработки сообщения — заканчивается считывание). Но не квантовая же механика пролезла в алгоритмы.
Хотя судя по вашему ответу — это вопрос не практического сорта.
AV>>Без этого знания невозможно написать программу обмена данными с портом.
C>Э.. видимо тут имеет место быть неверный протокол обмена. Это знание ненужно и даже вредно. В общем виде, при работе с последовательными устройствами нельзя полагаться на количество принятых данных. Нужно ввести спец. символы в протокол: например 0x1a — конец файла, если протокол символьный и проч.
Мне непонятны элементапрные вещи.
Я посылаю команду, к примеру CONNECT.
Сколько времени надо читать ответ? И когда ответ придет не может ли он окакзаться, к примеру CONN ( а вот ECT 9600 — просто не дочитаться и while в вашем коде закончиться).
Обработка события DataReceived проблему недополучения всего ответа на посланную команду не решает.
C>Ну, или, если иначе совсем никак, читайте данные в цикле, пока не наберете нужное количество..
C>То есть примерно так:
C>C>byte[] buffer = ...
C>int bytesToRead = ...
C>int readCounter = 0;
C>DateTime startTime = DateTime.Now;
C>while( readCounter < bytesToRead )
C>{
C> if( DateTime.Now - startTime > timeout )
C> {
C> // завершить цикл по таймауту
C> }
C> int read = com.Read( buffer, readCounter, bytesToRead - readCounter );
C> readCounter += read;
C>}
C>
Тогда может случиться так, что количество byteToRead == 0 — истина, только потому что, не хватило времени (времени выполнения цикла) для заполнения буфера, в которм хранятся считываемые байты (а введем Thread.Sleep(кол-во) в цикл — этот цикл бкдет работать большее количество раз). — Никак без времени считывания не обойтись (т.е. какое кол-во устанавливать в Sleep()?).
AV>>Драйвер модема не гружу (работаю с модемом напрямую через порт). Thread.Sleep(500); — закомментировал. Время получения ответа — 0;
C>А я писал про драйвер последовательного порта, а не модема. Драйвер модема для полседовательного порта — просто INF файл, где прописаны AT последовательности для основных операций с модемом: инициализировать, набрать номер, ответить на вызов и проч.
Понятно. Но ведь ващ ответ предполагал, что Sleep(500). А он 0 (закомментирован).
А лампочки на модеме моргают на ATZ не 0mc.
Вообще-то мне надо обмениваться 64-битными пакетами: послать 64-бита, принять ответ — 64 бита. Не знаю может ли быть разрыв в чтении (сосчитал 3 байта, потом пауза, потом остальные 5 байтов).