Вниз
Скачать: 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
4-40211
Eugene "Jek" Efimochkin
2002-04-12 00:02
2002.06.13
Приложение - toolbar


1-40031
XAlert
2002-05-31 21:05
2002.06.13
16 разрядные DLL в Delphi 5/6 ?


3-39963
StasV
2002-05-21 18:18
2002.06.13
Первые шаги в Дельфи и SQL


1-40017
Verq
2002-05-31 23:19
2002.06.13
Объект по имени.


3-39960
С.е.р.ж.
2002-05-19 19:12
2002.06.13
Проблемы с выборкой данных из таблиц.




   Наверх