![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Событие чтения из Com порта происходит когда в порте ничего нет
Kolan © (2006-05-30 18:37:00)Здравствуйте,
Для чтения из порта использую вот такую ф-цию:
function TAnisochronousComm.Read(var Buffer: array of Byte;
NumberOfBytesToRead: Cardinal; TimeOut: Cardinal;
var IsTimeOutExpire: Boolean): Cardinal;
begin
Result := 0;
IsTimeOutExpire := False;
if FPortHandle <> INVALID_HANDLE_VALUE then
begin
if TimeOut <> INFINITE then
TimeOut := TimeOut * NumberOfBytesToRead;
ReadFile(FPortHandle, Buffer, NumberOfBytesToRead, Cardinal(Result),
@FOverlappedRead);
if WaitForSingleObject(FOverlappedRead.hEvent, TimeOut) = WAIT_OBJECT_0 then
GetOverlappedResult(FPortHandle, FOverlappedRead, Cardinal(Result), False)
else
IsTimeOutExpire := True;
end;
end;
Вызываю вот так:
FBytesRead := FCommPort.Read(FBuffer, 1, INFINITE, IsTimeOut);
Вот тут я попросил прочесть 1 байт. СоответственноWaitForSingleObjectдолжна ждать пока не придет 1 байт, так? Но событие случается даже если в порт ничего не приходит. ИGetOverlappedResult(FPortHandle, FOverlappedRead, Cardinal(Result), False)Result равен 0.
Эффекет проявляется при маленьких количествах считываемых байт, при больших 10, 20 такого нет.
Почему так получается?
han_malign (2006-05-31 12:37:00) [21]FOverlappedRead.hEvent - как создаешь?
tesseract (2006-05-31 10:13:00) [22]и GetOverlappedReult не вернёться пока не закончен вывод.
В оригинале она вернёться (!!!!)
Сергей М. (2006-05-31 09:15:00) [23]
> в чём разница?
Разница большая - в [3] есть анализ результата работы ф-ции ReadFile() на предмет ERROR_IO_PENDING, а в твоем коде этого анализа нет. А от этого результата напрямую зависит дальнейшее ветвление алгоритма (ждать или не ждать), которое у тебя напрочь отсутствует.
Kolan (2006-05-30 23:12:00) [24]
> Кусок рабочего кода:
Так и мой код работает, когда байты есть событие тоже приходит. А в чём разница?
tesseract (2006-05-30 22:00:00) [25]Кусок рабочего кода:
succ :=ReadFile(hCom,buffer,size,result,@REadOL);
if not succ then
begin
tmp:=GetLastError;
if tmp=ERROR_IO_PENDING then
if WaitForSingleObject(ReadOl.hEvent,WaitInt)=WAIT_OBJECT_0 then
GetOverlappedResult(hCom, ReadOL, result,true);
end; // if not succ
end // if fComWait
Kolan (2006-05-30 21:33:00) [26]Нет, нет это не он, проверял. Тем более:
FBytesRead := FCommPort.Read(FBuffer, 1, INFINITE, IsTimeOut);
Не думаю что он может сбыться...
tesseract (2006-05-30 21:28:00) [27]или пока не случиться timeout.
Возможно проблема в нём.