Форум: "Система";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];
Внизснова 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c