![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
снова com-порт
Pilipiuk Evgeniy © (2003-08-14 19:42:00)
Здравствуйте! Нужна помощь людей работавших с com-портом. Использую следующую процедуру чтения данных с порта:
procedure ReadCom;
var
Recive: array [0..255] of char;
i,len,timeout: integer;
loaded: boolean;
begin
error:=false;
for i:=0 to 255 do recive[i]:=#0;
loaded:=false;
TransMask:=0;
timeout:=0;
repeat
inc(timeout);
WaitCommEvent(ComHandle,TransMask,nil);
if (TransMask and EV_RXFLAG)=EV_RXFLAG then begin
ClearCommError(ComHandle,Errs,@Stat);
KolByte:=Stat.cbInQue;
ReadFile(ComHandle,Recive,KolByte,KolByte,nil);
ReceivedString:=string(Recive);
len:=StrLen(PChar(ReceivedString));
if (ReceivedString[len]=#$0D) then loaded:=true;
end;
if timeout>100 then error:=true;
until (loaded) or (timeout>100);
end;
Проблема в том что если на порт ничего не приходит, то программа застрявает на функции WaitCommEvent. Не подскажете чем её заменить?
jack128 (2003-08-18 14:34:00) [1]
> TerminateThread просто шлет потоку команду закрыться
Давайте не будем путать api-функцию TerminateThread и метод класса TThread.Terminate(); ;-)
Sheng (2003-08-16 18:07:00) [2]
Зачем мудрить потоки? Поставить таймаут SetCommTimeouts - и оно само вылетит с ошибкой через нужное вам время. Проще некуда.
Viktorious (2003-08-16 17:06:00) [3]
TerminateThread просто шлет потоку команду закрыться. Сам поток должен проверять в цикле переменную Terminated и выходить по ней:
...
while true do
begin
if Terminated then Break;//или Exit
...//тело потока
end;
jack128 (2003-08-15 22:23:00) [4]
> лучше всего, закинь код для работыс портом с отдельный поток
> и но проблеб,
Проблем есть, их не может не есть :-). Как коректно завершить поток, когда он зависнет? TerminateThread не катит..
-=Vlad=- (2003-08-15 10:56:00) [5]
ЗЫ если не нравиться WaitCommEvent, то использую как ты и делаешь в примере ClearCommError и если cbInQue отлично от нуля, можешь смело вынимать из порта данные.
-=Vlad=- (2003-08-15 10:52:00) [6]
А лучше всего, закинь код для работыс портом с отдельный поток и но проблеб, пусть себе застрЯвает 8)) .Она кстати не застряет а ждет события от порта. На какие события (events) реагирует WaitCommEvent отвечает функция SetCommMask.
ЗЫ Не забудь зациклить поток.
Sheng (2003-08-15 00:06:00) [7]
procedure SetTimeout(Timeout: Word);
var
CommTimeout: TCommTimeouts;
begin
with CommTimeout do
begin
ReadIntervalTimeout:=1;
ReadTotalTimeoutMultiplier:=1;
ReadTotalTimeoutConstant:=Timeout;
WriteTotalTimeoutMultiplier:=1;
WriteTotalTimeoutConstant:=Timeout;
end;
SetCommTimeouts(hComPort,CommTimeout);
end;
SetTimeout(500); - вызвать сразу после инициализации COM-порта.
procedure ReadCom;
begin
....
end;
jack128 (2003-08-14 22:17:00) [8]
Открывать порт асинхронно и вместо последнего nil ставь указатель на структуру Toverlapped, тогда функция работает асинхронно...