Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.006 c
3-39931
Катерина
2002-05-18 13:16
2002.06.13
Общий тип поля


3-39975
AlexMey
2002-05-20 02:27
2002.06.13
ComboBox и ID выбранного элемента


6-40135
BugMaker
2002-03-28 18:47
2002.06.13
RenameFile (Local>Nowell)


14-40166
Rammish
2002-05-11 12:45
2002.06.13
О Дельфи 6


14-40158
Дремучий
2002-05-10 12:54
2002.06.13
Правка функций в UBPFD




   Наверх