Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.13;
Скачать: CL | DM;

Вниз

Таймауты при чтении COM-порта   Найти похожие ветки 

 
EsKor   (2002-03-18 08:20) [0]

Для побайтного (посимвольного) чтения данных использую следующий код:
function Receiving(hPort: THandle; maxLength: Word): String;
var
i, j: Byte;
ReadByteNum: Cardinal; //Кол-во принятых байтов
WaitByteNum: Byte; //Кол-во ожидаемых байтов при приеме
ReceivedData: Char; //Буфер приема
begin
Result := ""; //Еще ничего не принято
ReceivedData := #0;
i:=0; //Всего принято байтов (символов)
WaitByteNum := 1; //Кол-во ожидаемых байтов при приеме
repeat
if not ReadFile(hCOMport, ReceivedData, WaitByteNum, ReadByteNum, nil) then
begin
if UseBalance then //Если к моменту чтения порт закрыт, сообщ.не выводить
ShowMessage("Ошибка чтения порта: #" + IntToStr(GetLastError));
Exit;
end;
if ReadByteNum > 0 then
begin
if ReceivedData in [#13,#10] then Exit; //Конец строки - прекратить прием
Result := Result + ReceivedData; //иначе добавить символ к строке
inc(i); //учесть принятый символ
if i > maxLength then Break; //Принято слишком много - прекратить прием
end; {if ReadByteNum}
until ReadByteNum = 0; //Ничего нет или ничего не стало

if Result <> "" then
begin //что-то принималось и вдруг ничего не стало
if (i <= maxLength) and (ReadByteNum = 0) then
Result := Result + " notEOL"; //нет признака конца строки
end;
end; {function Receiving}


Значения таймаутов следующие:
ReadIntervalTimeout:=10;
ReadTotalTimeoutMultiplier:=1;
ReadTotalTimeoutConstant:=0;


IMHO я полагал, что смысл ReadIntervalTimeout заключается в том, что если порт пуст, то функция ReadFile ждет указанное количество времени (мс) и только после этого возвращает пустое значение если данных в порт так и не поступило. Но реализация чтения порта в приведенном выше виде выявило, что это не работает. Т.е. часто происходит следующее: после нескольких удачно считанных символов, наступает момент когда в порту пусто, следующий символ еще не успел поступить в порт (скорость 2400). Не зависимо от значения ReadIntervalTimeout (доводил до 1000) функция ReadFile, похоже без ожидания, возвращает ReadByteNum=0, т.е. текущая строка данных досрочно обрывается. Хотя если между приемами символов тупо использовать задержку, например Sleep(3), или используя таймер, то все нормально, ничего не теряется.


 
EsKor   (2002-03-19 02:20) [1]

Хотя собственно вопрос в явном виде в сообщении не значится, может, все-таки, знатоки поделитесь своими соображениями по поводу означенной проблемы.
Или вопрос не потеме этой ветви форума?



Страницы: 1 вся ветка

Текущий архив: 2002.06.13;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.013 c
1-40028
Alex_KR
2002-06-01 10:44
2002.06.13
Windows XP


14-40174
Ajax
2002-05-12 17:35
2002.06.13
Ну не верю я, что ни кто ответа не знает...


3-39942
com6
2002-05-19 09:55
2002.06.13
Мастера, помогите выбрать БД


14-40185
Riko
2002-05-08 12:28
2002.06.13
Как быстро переустановить все компоненты...


3-39925
Vint
2002-05-20 13:02
2002.06.13
try... except