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

Вниз

снова com-порт   Найти похожие ветки 

 
Pilipiuk Evgeniy   (2003-08-14 19:42) [0]

Здравствуйте! Нужна помощь людей работавших с 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-14 22:17) [1]

Открывать порт асинхронно и вместо последнего nil ставь указатель на структуру Toverlapped, тогда функция работает асинхронно...


 
Sheng ©   (2003-08-15 00:06) [2]

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;


 
-=Vlad=- ©   (2003-08-15 10:52) [3]

А лучше всего, закинь код для работыс портом с отдельный поток и но проблеб, пусть себе застрЯвает 8)) .Она кстати не застряет а ждет события от порта. На какие события (events) реагирует WaitCommEvent отвечает функция SetCommMask.
ЗЫ Не забудь зациклить поток.


 
-=Vlad=- ©   (2003-08-15 10:56) [4]

ЗЫ если не нравиться WaitCommEvent, то использую как ты и делаешь в примере ClearCommError и если cbInQue отлично от нуля, можешь смело вынимать из порта данные.


 
jack128 ©   (2003-08-15 22:23) [5]


> лучше всего, закинь код для работыс портом с отдельный поток
> и но проблеб,

Проблем есть, их не может не есть :-). Как коректно завершить поток, когда он зависнет? TerminateThread не катит..


 
Viktorious   (2003-08-16 17:06) [6]

TerminateThread просто шлет потоку команду закрыться. Сам поток должен проверять в цикле переменную Terminated и выходить по ней:
...
while true do
begin
if Terminated then Break;//или Exit
...//тело потока
end;


 
Sheng ©   (2003-08-16 18:07) [7]

Зачем мудрить потоки? Поставить таймаут SetCommTimeouts - и оно само вылетит с ошибкой через нужное вам время. Проще некуда.


 
jack128 ©   (2003-08-18 14:34) [8]


> TerminateThread просто шлет потоку команду закрыться

Давайте не будем путать api-функцию TerminateThread и метод класса TThread.Terminate(); ;-)



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

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

Наверх




Память: 0.48 MB
Время: 0.017 c
7-98896
vvvvvvvvv
2003-08-06 12:33
2003.10.30
Как отследить копирование-перенос файлов в системе?


3-98448
wHammer
2003-10-10 12:07
2003.10.30
Проблема с TSession


1-98722
arche
2003-10-20 13:54
2003.10.30
Подсветка синтаксиса в приложении под


14-98878
Igorek
2003-10-10 12:39
2003.10.30
Есть идея - универсальный парсер


1-98538
oens
2003-10-21 15:26
2003.10.30
создание EXE файла