Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Событие чтения из Com порта происходит когда в порте ничего нет


Страницы:   1 2

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.

Возможно проблема в нём.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо