Главная страница
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.015 c
1-40086
RF_Vital
2002-06-02 22:26
2002.06.13
Необходимо разобрать wav файл... (объясните как чайнику)


6-40139
kvcomp
2002-03-21 11:51
2002.06.13
Уважаемые Мастера! Очень нужна Ваша помощь! Срочно!!!


1-40098
kolobok11
2002-06-02 23:11
2002.06.13
Help ! Не могу получить имя файла *.dll с помощью TOpenDialog.


3-39929
koks
2002-05-21 10:00
2002.06.13
Вопрос по TADOQuery


8-40120
MrAngel
2002-01-18 16:19
2002.06.13
Получение уровня сигнала на выходе звуковой карты.