| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- {
- 洪锐杰
- for kylix linux
- }
- unit CommTool;
- interface
- uses
- libc,uPublic,SysUtils;
- type
- TCommTools=class
- Port:THandle;
- OptOld,Opt:TTermIos;
- tv:timeval;
- readfd:TFdSet;
- function ReadData(var buf:TResultByteArray;porttype:byte):integer;virtual;
- function sendData(var buf: array of byte;leng:integer):integer;virtual;
- function readDatabyte:integer;virtual;
- private
- { Private declarations }
- public
- { Public declarations }
- constructor create(ComName:pchar;Baud:integer=9600;StopBits:INTEGER=0;Parity:INTEGER=0;ByteSize:INTEGER=8);virtual;
- end;
- implementation
- {通讯类}
- constructor TCommTools.create(ComName:pchar;Baud:integer=9600;StopBits:INTEGER=0;Parity:INTEGER=0;ByteSize:INTEGER=8);
- var ios: termios;
- begin //O_NONBLOCK
- port:= LibC.Open (ComName,O_RDWR or O_NOCTTY);
- //__flock(port,LOCK_EX);
- tcgetattr (port,ios);
- cfmakeraw (ios);
- case Baud of
- 300:
- begin
- cfsetospeed (ios, B300);
- cfsetispeed (ios,B300);
- end;
- 600:
- begin
- cfsetospeed (ios, B600);
- cfsetispeed (ios,B600);
- end;
- 1200:
- begin
- cfsetospeed (ios, B1200);
- cfsetispeed (ios,B1200);
- end;
- 2400:
- begin
- cfsetospeed (ios, B2400);
- cfsetispeed (ios,B2400);
- end;
- 4800:
- begin
- cfsetospeed (ios, B4800);
- cfsetispeed (ios,B4800);
- end;
- 9600:
- begin
- cfsetospeed (ios, B9600);
- cfsetispeed (ios,B9600);
- end;
- 19200:
- begin
- cfsetospeed (ios, B19200);
- cfsetispeed (ios,B19200);
- end;
- 38400:
- begin
- cfsetospeed (ios, B38400);
- cfsetispeed (ios,B38400);
- end;
- else
- begin
- cfsetospeed (ios, B9600);
- cfsetispeed (ios,B9600);
- end;
- end;
- tcsetattr (port,tcsanow,ios);
- //linux
- {
- if port=0 then
- BEGIN
- // open( Dev, O_RDWR|O_NOCTTY|O_NDELAY );
- port:= Libc.Open( '/dev/ttyM1', O_RDWR or O_NOCTTY or O_NDELAY) ; //以可读写、非阻塞打开串口
- tcgetattr( port, OptOld) ; //获取串口通信参数
- cfmakeraw( Opt) ; //设为RAW模式
- cfsetispeed( Opt, B9600 ) ; //设输入波特率为9 600
- cfsetospeed( Opt, B9600) ; // 设输出波特率为9 600
- Opt.c_cflag:=Opt.c_cflag and not CSIZE;
- Opt.c_cflag:=Opt.c_cflag or cs7 ; //设数据位为七位
- Opt.c_cflag:=Opt.c_cflag or PARENB; //设有校验位
- Opt.c_cflag:=Opt.c_cflag and not PARODD; //为偶校验
- Opt.c_cflag:=Opt.c_cflag and not CSTOPB; //设一位停止位
- tcsetattr( port, TCSANOW, Opt) ; // 设置串口通信参数
- end; }
- end;
- function TCommTools.ReadData(var buf:TResultByteArray;porttype:byte):integer;
- var
- RecevieBuf : TResultByteArray; //存放接到的数据 ,通过它转换成字符放到 str
- dwByte,i:integer;
- dwbyte2,dwbyte3:integer;
- const nRBufLen=512;
- begin
- tv.tv_sec:=0;
- tv.tv_usec:=1000 ;
- FD_ZERO(readfd);
- FD_SET(PORT,readfd);
- dwByte2:=0;
- dwbyte3:=0;
- dwByte:=0;
- dwByte:=select(port+1,(@readfd),nil,nil,(@tv));
- if dwbyte>0 then
- begin
- dwByte:=0;
- dwByte2:=0;
- dwbyte3:=0;
- SetLength(RecevieBuf,nRBufLen);
- dwByte:=__Read(Port ,RecevieBuf[0],nRBufLen);
- if dwByte>0 then
- dwbyte3:=dwbyte3+dwbyte;
- if RecevieBuf[0]<>$fa then
- begin
- Result:=0;
- exit;
- end;
- if porttype=0 then
- dwbyte2:= strtointdef(inttohex(RecevieBuf[4],2)+inttohex(RecevieBuf[5],2),0)+8
- else
- dwbyte2:= strtointdef(inttohex(RecevieBuf[5],2)+inttohex(RecevieBuf[6],2),0)+9;
- if dwbyte2>100 then
- begin
- Result:=0;
- exit;
- end;
- dwbyte2:=dwbyte2-dwByte;
- while dwbyte2>0 do
- begin
- dwByte:=__Read(Port ,RecevieBuf[dwbyte3],nRBufLen-dwbyte3);
- if dwbyte>0 then
- begin
- dwByte2:=dwByte2-dwByte;
- dwbyte3:=dwbyte3+dwbyte;
- end
- else
- break;
- end;
- end;
- if dwbyte3>0 then
- begin
- SetLength(buf,dwbyte3);
- for i:=0 to dwbyte3 -1 do
- buf[i]:= RecevieBuf[i];
- end;
- Result:= dwbyte3;
- end;
- {
- function TCommTools.ReadData(var buf: TResultByteArray): integer;
- var
- s: string;
- a:array [0..500] of char;
- zaehler, index: integer;
- begin
- s:= '';
- a:=''; ;
- zaehler:= FileRead (port, a, sizeof (a));
- // memo1.Lines.Add( IntToStr (zaehler));
- if zaehler > 0
- then begin
- setlength(buf,zaehler);
- for index:= 0 to zaehler do
- buf[index]:= ord(a [index]);
- //memo1.Lines.Add( s )
- end;
- result:=zaehler;
- end;}
- function TCommTools.sendData(var buf: array of byte;leng:integer):integer;
- begin
- tcflush(Port, TCIFLUSH);
- Result:=__Write( Port,buf,leng );
- end;
- function TCommTools.readDatabyte: integer;
- var
- RecevieBuf : TResultByteArray; //存放接到的数据 ,通过它转换成字符放到 str
- dwByte,i:integer;
- dwbyte2,dwbyte3:integer;
- begin
- tv.tv_sec:=0;
- tv.tv_usec:=1000 ;
- FD_ZERO(readfd);
- FD_SET(PORT,readfd);
- dwByte:=0;
- dwByte:=select(port+1,(@readfd),nil,nil,(@tv));
- if dwbyte>0 then
- begin
- Result:=__Read(Port ,RecevieBuf[0],254);
- end
- else
- Result:=0;
- end;
- end.
|