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

Вниз

Требуется нормальная стаюильная работа с COM портом под NT.   Найти похожие ветки 

 
Dima_Delphi ©   (2004-07-16 18:56) [0]

Требуется нормальная стаюильная работа с COM портом под NT.
Кто может помочь, в общем работу знаю, но стабильности так и не добился, по порту связь с Пик контролером.
Если кто работал подскажите.
Аконечно самый ценный материал это исходники!!!!!!!!!!!!!


 
Reindeer Moss Eater ©   (2004-07-16 18:57) [1]

CreateFile
ReadFile
WriteFile

Исходники - в PlatFormSDK


 
y-soft ©   (2004-07-16 22:05) [2]

>Dima_Delphi ©   (16.07.04 18:56)  

Что Вы понимаете под "стабильностью"?

Если работу в реальном времени, то средствами WinAPI ничего не получится


 
GanibalLector ©   (2004-07-16 22:11) [3]

>конечно самый ценный материал это исходники

function LStr(const Source:Ansistring;Count:Integer):Ansistring;
begin
 Result:=Copy(Source,1,Count);
end;

function OpenComm(Mode:AnsiString):THandle;
var
 DCB : TDCB;
 TOut: TCommTimeouts;
 I:Integer;
 Bfr:AnsiString;
begin
 Bfr:=Mode;
 UniqueString(Bfr);
 I:=Pos(":",Bfr)-1;
 if I<=0 then I:=4;
 Result := CreateFile(PChar(LStr(Bfr,I)),GENERIC_READ or GENERIC_WRITE,
        0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

 GetCommState( Result, DCB) ;
 BuildCommDCB(PChar(Bfr),DCB);
 DCB.EvtChar := #13;
 SetCommState( Result, DCB) ;
 //
 TOut.ReadIntervalTimeout         := MAXDWORD;
 TOut.ReadTotalTimeoutMultiplier  := 0;
 TOut.ReadTotalTimeoutConstant    := 0;
 TOut.WriteTotalTimeoutMultiplier := 0;
 TOut.WriteTotalTimeoutConstant   := 0;
 SetCommTimeOuts( Result, TOut);
   SetCommMask(Result,EV_RLSD OR EV_RXFLAG);
   PurgeComm(Result,PURGE_TXCLEAR);      //clear transmit buffer
   PurgeComm(Result,PURGE_RXCLEAR);      //clear receive buffer
end;

function ReadComm(Handle:THandle; var Bfr:AnsiString):Integer;
var
 I,J:DWord;
begin
 Result:=0;
 J:=Length(Bfr);
 repeat
   ReadFile(Handle, Bfr[Result+1], J-DWord(Result), I, nil);
   Inc(Result,Integer(I));
  if DWord(Result)=J then break;
 until I=0;
end;

function WriteComm(Handle:THandle; const Bfr:AnsiString):Integer;
var
 I,J:DWord;
begin
 Result:=0;
 J:=Length(Bfr);
 repeat
   WriteFile(Handle, Bfr[Result+1], J-DWord(Result), I, nil);
   Inc(Result,Integer(I));
   if DWord(Result)=J then break;
 until I=0;
end;

function CloseComm(Handle:THandle):boolean;
begin
CloseHandle(Handle);
result:=true;
end;

function SetRxTime(Handle:THandle; const TimeC,TimeM:Integer):Boolean;
var
 TOut:TCommTimeouts;
begin
 if (TimeC=0) AND (TimeM=0) then
   TOut.ReadIntervalTimeout       := MAXDWORD
 else TOut.ReadIntervalTimeout    := 0;
 TOut.ReadTotalTimeoutMultiplier  := TimeM;
 TOut.ReadTotalTimeoutConstant    := TimeC;
 TOut.WriteTotalTimeoutMultiplier := 0;
 TOut.WriteTotalTimeoutConstant   := 0;
 Result:=SetCommTimeOuts(Handle, TOut);
end;

ну,а дальше пример как работать:
...
Handle:=OpenComm("COM"+co+":BAUD="+baud+" PARITY=N DATA=8 STOP=1");
 if Handle=INVALID_HANDLE_VALUE then begin result:=false;exit;end;
 if GetFileType(Handle)<>FILE_TYPE_CHAR then begin result:=false;exit;end;
 setrxtime(handle,100,25);   //100,25

setlength(st,1);
   if readcomm(Handle,st)=1 then begin
   if st<>chr($0d) then  str:=str+st else begin
                                       writecomm(Handle,chr($0d));
                                       setlength(st,1);
                                       if readcomm(Handle,st)<>1 then
                                       begin closecomm(Handle);result:=false;exit;end;
                                                                 end;
...



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

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

Наверх




Память: 0.48 MB
Время: 0.031 c
4-1089842903
DeScriptor
2004-07-15 02:08
2004.08.29
Выбор директории


10-1023181688
Tot
2002-06-04 13:08
2004.08.29
midas.dll


14-1092219114
ArMellon
2004-08-11 14:11
2004.08.29
Помогите найти инфу по установке удалению шлюза и днс


1-1092368470
SASH2
2004-08-13 07:41
2004.08.29
Работа над ошибками?


1-1092645668
Bizon`s
2004-08-16 12:41
2004.08.29
Update Delphi6