Re[6]: Что определяет ReadTimeout SerialPort?
От: Andrej-V  
Дата: 03.01.07 00:24
Оценка:
Здравствуйте, 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 байтов).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.