Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2002.06.13;
Скачать: [xml.tar.bz2];

Вниз

Таймауты при чтении 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.008 c
1-40033
demon-777
2002-05-30 04:04
2002.06.13
Как вызвать стандартное окно


3-39977
кондратий
2002-05-19 14:16
2002.06.13
DBGrid с нумеротацией строки ...


4-40200
Poirot
2002-04-10 07:10
2002.06.13
Mutex


14-40165
Dollattorys
2002-05-06 17:05
2002.06.13
Вот писал проект на Delphi5, решил перейти на Delphi6...


1-40107
Nikolka
2002-05-31 09:56
2002.06.13
сохранение постоянной





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский