Текущий архив: 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.47 MB
Время: 0.03 c