Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.10;
Скачать: CL | DM;

Вниз

Организация TimeOut для Overlapped чтения из com порта.   Найти похожие ветки 

 
Erik1   (2004-09-09 14:51) [0]

Я хочу узнать можно ли задавать TimeOut при работе с ком портои в Overlapped режиме? Точнее ReadIntervalTimeout?
 Я пользуюсь готовым компонентом "VARIAN ASYNC32 COMPONENT v1.48" и работаю с внешним устройством. Мне надо читать из него пакеты разного размера в зависимости от посланой команды. До этого работал с постояным размером пакета. Считавание производил после проверки:
   repeat
     Sleep(25);
     Inc(i);
   until not (InQueCount < 11 ) or  not (i < 16);
   RSize := Read(PChar(Buffer)^, 12);
---------------------------------------------------------
InQueCount - это фуикция
   ClearCommError(FHandle, Errors, @ComStat);
   Result := ComStat.cbInQue;
Read:
function TCustomComm.Read(var Buf; Count: Integer): Integer;
var
 Overlapped: TOverlapped;
 ErrorCode: Integer;
begin
 Lock;
 try
   FillChar(Overlapped, Sizeof(Overlapped), 0);
   Overlapped.hEvent := FEvent.Handle;
   if not ReadFile(FHandle, Buf, Count, DWord(Result),
     @Overlapped) and (GetLastError <> ERROR_IO_PENDING) then
   begin
     ErrorCode := GetLastError;
     RaiseCommError(sReadError, ErrorCode);
   end;
   if FEvent.WaitFor(FReadTimeout) <> wrSignaled then
     Result := -1
   else
    begin
      GetOverlappedResult(Handle, Overlapped, DWord(Result), False);
      FEvent.ResetEvent;
    end;
 finally
   Unlock;
 end;
end;
---------------------------------------------------------------
Думаю, что при ReadIntervalTimeout := 25 могу гарантировать что данных больше нет. Может есть еще какието идеи по чтению данных?


 
Erik1   (2004-09-09 16:21) [1]

Тоесть если я после вызава функции Read вызову GetOverlappedResult(...,True) то она будет ждать выполнения условия по TimeOut или вобще можно вызвать WaitForSingleObject(1, Overlapped.hEvent, False, 1000)?


 
Erik1   (2004-09-10 10:18) [2]

Что опять никто незнает никого нет? А добавил такую функцию:
function TCustomComm.WaitRead(var Buf: String): Integer;
var
 Overlapped: TOverlapped;
begin
 FillChar(Overlapped, Sizeof(Overlapped), 0);
 Overlapped.hEvent := FEvent.Handle;
 GetOverlappedResult(FHandle, Overlapped, DWord(Result), True);  
 FEvent.ResetEvent;
 SetLength(Buf, Result);
 if not ReadFile(FHandle, PChar(Buf)^, Result, DWord(Result), nil) then
   RaiseCommError(sReadError, GetLastError);
end;
Она предназначена для чтения с ожиданием в асинхроном режиме. Насколько я понимаю, в моем случии WaitCommEvent нафиг нужен?


 
Анатолий   (2004-09-10 10:56) [3]

Почитай это http://bcb.net.ru/article/hard/index003.html. Тут хорошо все это объясняется и есть примеры.


 
Erik1   (2004-09-10 12:07) [4]

Там ничего не обяснено, а приведены вызовы и их параметры. К томуже это я уже читал. Но так и непонял почему моя функция WaitRead ничего нечитает.


 
Chlavik ©   (2004-09-10 16:11) [5]

Если так хочеш что бы всё работало через компонент пишеш наследника TMyComm
у которого добавляеш свой метод read

function TMyComm.Read(var Buf; var Count: Integer): boolean;  //Result - был timout или нет
var
Overlapped: TOverlapped;
ErrorCode: Integer;
begin
Lock;
try
  FillChar(Overlapped, Sizeof(Overlapped), 0);
  Overlapped.hEvent := FEvent.Handle;
  if not ReadFile(FHandle, Buf, Count, DWord(Result),
    @Overlapped) and (GetLastError <> ERROR_IO_PENDING) then
  begin
    ErrorCode := GetLastError;
    RaiseCommError(sReadError, ErrorCode);
  end;
Result := WaitForSingleObject(FEvent.Handle , FReadTimeout)  <>     WAIT_TIMEOUT
 if Result then
  begin
     GetOverlappedResult(Handle, Overlapped, DWord(Result), False);
     FEvent.ResetEvent;
   end;
finally
  Unlock;
end;
end;

а потом делаеш цикл
while TMyComm.Read(Buf,Count) do
begin
// обрабатываеш данные
end;



 
Chlavik ©   (2004-09-10 16:13) [6]

Только ж не TMyComm.Read(Buf,Count) а Экземпляр_TMyComm.Read...


 
Chlavik ©   (2004-09-10 16:15) [7]

ОЙ while FMyComm.TimeoutRead(Buf,Count) do
begin
// обрабатываеш данные
end;

Вот ...


 
Chlavik ©   (2004-09-10 16:18) [8]

Почему ты не юзаеш WaitCommEvent ????


 
Erik1 ©   (2004-09-10 16:31) [9]

Ну вот, а на вопросто нет ответа. Окуда я знаю сколько считывать?
Если кто подскажет как отследить конец передачи не логическими методами буду благодарен. Все это задумывалось для того, чтобы читать пакеты переменой длинны!


 
Erik1 ©   (2004-09-10 17:40) [10]

Вопрос снят, ошибка была элементарная вопервых сначала надо было сделать ReadFile а после GetOverlappedResult. И вторая вобще смешно я неправельно задал TimeOut из за того, что при перекрытии процедуры вместо override написал overload :)
Всем спасибо.


 
Erik1 ©   (2004-09-10 17:40) [11]

Вопрос снят, ошибка была элементарная вопервых сначала надо было сделать ReadFile а после GetOverlappedResult. И вторая вобще смешно я неправельно задал TimeOut из за того, что при перекрытии процедуры вместо override написал overload :)
Всем спасибо.



Страницы: 1 вся ветка

Текущий архив: 2004.10.10;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.023 c
1-1095863606
DelphiLexx
2004-09-22 18:33
2004.10.10
Чему равна константа GWW_HINSTANCE


14-1095860037
Soft
2004-09-22 17:33
2004.10.10
HeatPC.com


1-1096053766
fatal
2004-09-24 23:22
2004.10.10
Событие "Скролл колесика мыши" в DBGrid


1-1095888698
Константинов
2004-09-23 01:31
2004.10.10
Подскажите, как правильно работать со свойствами-массивами


6-1091533976
Victor
2004-08-03 15:52
2004.10.10
Чат на сокетах