از دوستانی که طریقه کار کردن با پورت Rs232 رو بلدند میخوام یک توضیحی راجع بهش بدند
Printable View
از دوستانی که طریقه کار کردن با پورت Rs232 رو بلدند میخوام یک توضیحی راجع بهش بدند
خب به نظر میرسه که خبری نیست
به این یک نگاهی بندازید اگه کسی چیزای بیشتری میدونه لطفا بزاره :
کد:unit com_io;
interface
uses SysUtils;
const
ti_fast=1; (* 0.001 s*)
ti_slow=500; (* 0.5 s*)
type
Tcom=(com1,com2);
Tbaud=(_9k6,_19k2,_38k4);
ExCom= class(exception);
procedure open_com(port: Tcom);
procedure set_com(rate: Tbaud);
procedure set_fast_timing;
procedure set_slow_timing;
procedure set_buf(len_in, len_out: longint);
procedure putb(b: byte; var ok: boolean);
procedure getb(var b: byte; var ok: boolean);
procedure putb_ex(b: byte);
procedure getb_ex(var b: byte);
procedure puta(a: array of byte; var len: integer);
procedure geta(var a: array of byte; var len: integer);
procedure close_com;
implementation
uses windows;
const
cbr: array [Tbaud] of DWORD =(CBR_9600,CBR_19200,CBR_38400);
cport: array [Tcom] of string =('COM1','COM2');
var
is_open: boolean = false;
com: Thandle;
DCB: TDCB;
timeouts: TCommTimeouts;
procedure open_com(port: Tcom);
begin
if is_open then closeHandle(com);
com := CreateFile(PChar(cport[port]), GENERIC_READ or GENERIC_WRITE,
0, nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
if com>0 then is_open:=true else raise Excom.Create('open_com');
end;
procedure set_buf(len_in, len_out: longint);
begin
if not SetupComm(com, len_in, len_out) then raise Excom.Create('set_buf');
end;
procedure set_com(rate: Tbaud);
(* press Ctrl-F1 on following keyword: SetComState *)
begin
DCB.DCBlength:=SizeOf(Tdcb);
DCB.BaudRate:= cbr[rate];
DCB.Flags:=12305;
DCB.wReserved:=0;
DCB.XonLim:=6553;
DCB.XoffLim:=65535;
DCB.ByteSize:=8;
DCB.Parity:=0;
DCB.StopBits:=0;
DCB.XonChar:=#17;
DCB.XoffChar:=#19;
DCB.ErrorChar:=#0;
DCB.EofChar:=#0;
DCB.EvtChar:=#0;
DCB.wReserved1:=65;
if not SetCommState(com, DCB) then raise Excom.Create('set_com');
end;
procedure set_fast_timing;
(* press Ctrl-F1 on following keyword: commtimeouts *)
(* I had problems with MAXWORD, 0, 0 configuration *)
begin
timeouts.ReadIntervalTimeout:=1;
timeouts.ReadTotalTimeoutMultiplier:=0;
timeouts.ReadTotalTimeoutConstant:=1;
timeouts.WriteTotalTimeoutMultiplier:=2;
timeouts.WriteTotalTimeoutConstant:=2;
if not SetCommTimeouts(com,timeouts) then raise Excom.Create('set_timeout');
end;
procedure set_slow_timing;
begin
timeouts.ReadIntervalTimeout:=2;
timeouts.ReadTotalTimeoutMultiplier:=10;
timeouts.ReadTotalTimeoutConstant:=500;
timeouts.WriteTotalTimeoutMultiplier:=2;
timeouts.WriteTotalTimeoutConstant:=2;
if not SetCommTimeouts(com,timeouts) then raise Excom.Create('set_timeout');
end;
procedure putb(b: byte; var ok: boolean);
var res: integer;
begin
WriteFile(com, b, 1, res, nil);
ok:=(res=1);
end;
procedure getb(var b: byte; var ok: boolean);
var res: integer;
begin
ReadFile(com, b, 1, res, nil);
ok:=(res=1);
end;
procedure putb_ex(b: byte);
var res: integer;
begin
WriteFile(com, b, 1, res, nil);
if (res<>1) then raise ExCom.Create('put byte');
end;
procedure getb_ex(var b: byte);
var res: integer;
begin
ReadFile(com, b, 1, res, nil);
if (res<>1) then raise ExCom.Create('get byte');
end;
procedure puta(a: array of byte; var len: integer);
var res: integer;
begin
WriteFile(com, a, len, res, nil);
len:=res;
(* before call puta: len=bytes-to-put
after call puta: len=bytes-transmitted *)
end;
procedure geta(var a: array of byte; var len: integer);
var res: integer;
begin
ReadFile(com, a, len, res, nil);
len:=res;
(* after call geta: len=bytes-received *)
end;
procedure close_com;
begin
if not is_open then CloseHandle(com);
is_open:=false;
end;
end.
سلامنقل قول:
از اين استفاده كنيد :
کد:http://rapidshare.com/files/35316552/ComPort_3.2.rar
ممنون ازت که جواب دادی