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

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

снова 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, тогда функция работает асинхронно...


Наверх

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