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

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

Как проверить истек ли TimeOut при работе с портом [D7, WinXP]


Kolan ©   (2004-12-31 00:08:00) 

Здравствуйте,
 При работе с Com портом мне надо проверить, если прошло какое-то время, то значит устройство не отвечеет. Не пойму как это сделать(понятно что с помошью таймера).


DiamondShark   (2004-12-31 10:53:00) [1]


> Unleashed   (31.12.04 02:53) [1]

Мощно задвинул...


GanibalLector   (2004-12-31 02:58:00) [2]

http://www.delphikingdom.com/asp/viewitem.asp?UrlItem=/mastering/ports4.htm


Unleashed   (2004-12-31 02:53:00) [3]

В данном фрагменте проверяется состояние порта. проверка состояния порта  проводится 3-х секундным прослушиванием.
function commdialog(port: pchar): integer;
var
h: thandle;
com: _commconfig;
err: integer;
begin
h:= createfile(port,GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,
File_attribute_normal and FILE_FLAG_OVERLAPPED,0);
result:=0;
if h = INVALID_HANDLE_VALUE then begin
result:=1;
application.MessageBox('Íåò äîñòóïà ê ïîðòó ',port,mb_ok);
end else begin
getcommstate(h,ip);
com.dcb:=ip;
if not commconfigdialog(port,application.MainForm.Handle,com) then
begin if getlasterror ERROR_CANCELLED then
application.MessageBox(pchar('Îøèáêà ñáîðà ñâåäåíèé ' + inttostr(getlasterror)),
'Îøèáêà ââîäà-âûâîäà',mb_ok); result:=-1 end else
begin
ip:= com.dcb;
setcommstate(h,ip);
end;
end;
closehandle(h);
end;
var
ov: toverlapped;
i,i1,err: integer;
port,rbuf: pchar;
buf: char;
ss,ss1: string;
succ: boolean;
wr,wro,rd,rdo,ch: cardinal;
begin
clear.Enabled:=false;
snd.Enabled:=false;
can.Enabled:= true;
buf:=' ';
fillchar(ov,sizeof(ov),0);
ov.Offset:=0;
ov.hEvent:= createevent(nil,true,false,nil);
port:= pchar('COM' + pchar(m.Lines.strings[0])[3]);
err:= commdialog(port);
g.Show;
st.SimpleText:='';
if err -1 then
for i:=err to m.Lines.Count-1 do if not br then begin
ch:=0;
wr:=0;
rd:=0;
rdo:=0;
wro:=0;
ss:='';
g.Progress:=0;
update;
port:= pchar('COM' + pchar(m.Lines.strings[i])[3]);
h:= createfile(port,GENERIC_READ or GENERIC_WRITE,0,
nil,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
if h = INVALID_HANDLE_VALUE then begin
st.SimpleText:=port +': Íåò äîñòóïà';
end;
setcommstate(h,ip);
update;
if h INVALID_HANDLE_VALUE then
g.MaxValue:=strlen(pchar(m.Lines.strings[i]))-6 else g.MaxValue:=0;
getmem(rbuf,g.MaxValue);
for i1:=7 to strlen(pchar(m.Lines.strings[i])) do if not br then begin
if hinvalid_handle_value then
st.SimpleText:=port+ ': Îòïðàâêà äàííûõ...';
st.Update;
buf:= m.Lines.strings[i][i1];
if writefileex(h,@buf,1,ov,nil) then begin
application.ProcessMessages;
if getoverlappedresult(h,ov,wr,true) then inc(ch);
end;
rdo:=0;
application.ProcessMessages;
succ:= readfile(h,rbuf^,1,rdo,@ov);
if not succ then
if waitforsingleobject(ov.hEvent,3000)=wait_object_0 then
GetOverlappedResult(h,Ov,rdo,true)
else begin
ch:=0;
st.SimpleText:=port+ ': Íåò ñèãíàëà';
break;
end;
g.Progress:= g.Progress+1;
setstring(ss1,rbuf,1);
inc(wro);
ss:= ss+ss1;
end else break;
if (wro >0) and (ch>0) and (h INVALID_HANDLE_VALUE) then
st.SimpleText:=
port + ': Ñîîáùåíèå ïîëó÷åíî "' + ss +
'". Áàéò îòïðàâëåíî: ' + inttostr(ch) + '. Áàéò ïîëó÷åíî: '
+ inttostr(wro) + '. Ïîòåðè ïðè òðàíñìèññèè '+floattostr((ch -wro)/ch*100)+'%';
view.info.Items.Add(st.SimpleText);
application.ProcessMessages;
closehandle(h);
end
else begin
br:= false;
break;
end;
freemem(rbuf);
st.Hint:= st.SimpleText;
closehandle(ov.hEvent);
snd.Enabled:=true;
can.Enabled:=false;
clear.Enabled:=true;
g.Hide;
if view.info.Count >1 then
with view do begin
ClientHeight:=info.Items.Count*view.info.ItemHeight-info.Font.Height;
ClientWidth:= info.Canvas.TextWidth(info.Items.Strings[0])+info.Font.Size;
ShowModal;
info.Clear;
end else view.info.Clear;
end;
procedure Tport.CanClick(Sender: TObject);
begin
br:= true;
can.Enabled:= false;
snd.Enabled:=true;


Наверх

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