Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
3-98504
KIR
2003-10-09 13:08
2003.10.30
Порядковый номер строки в запросе IB


6-98783
Vladimir
2003-09-05 11:42
2003.10.30
Подключен ли сетевой кабель


1-98727
slap
2003-10-20 12:02
2003.10.30
ShellExecute


1-98694
lasso
2003-10-21 10:06
2003.10.30
Label


1-98710
snake1977
2003-10-21 11:48
2003.10.30
TLabel





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский