?? uscontrol.~pas
字號:
unit USControl;
interface
uses
Windows,SysUtils;
const
//RS232 pin 2 cts
CTSBit = $00000008;
//RS232 pin 3 dsr
DSRBit = $00000004;
//RS232 pin 4 dtr
DTRBit = $00000010;
//RS232 pin 7 rts
RtsBit = $00001000;
type
TSerialSet=Record //參置串口參數(shù)
BaudRate:DWord; //波特率
ByteSize:Byte; //數(shù)據(jù)位
Parity:Byte; //校檢位
StopBits:Byte; //停止位
TimeOuts:COMMTIMEOUTS; //超時時間
end;
type
TSerialControl = Class
protected
m_hComm:DWord; //定義串口操作句柄
public
m_Opened:Boolean; //定義串口打開結(jié)果
m_SerialSet:TSerialSet; //定義串口參數(shù)設(shè)置記錄類變量
Constructor
Create; //TSerialControl構(gòu)造方法聲明
published //函數(shù)與過程聲明
Function OpenSerial(CommPort:Integer;ShareMode:Boolean=FALSE):Integer;
Procedure setSerialStatus;
Function CloseSerial:Integer;
Function ReadCom(var RetStr:string;var TotalBytes:Integer;NumberOfBytesToRead:DWord;PurgeFlag:Boolean=FALSE;TimeOut:DWord=1000):Integer;
Function WriteCom(var SendStr:string;NumberofBytesToWrite:DWord;PurgeFlag:Boolean=FALSE;TimeOut:DWord=1000):Integer;
Procedure SetDTR(Status:Boolean);
Procedure SetRTS(Status:Boolean);
Procedure GetCtsDsr(Var CTSStatus,DSRStatus:Boolean);
Function WaitForCTSDSR(Var CTSStatus,DSRStatus:Boolean):Boolean;
procedure purgeReadWrite(RWFlag:Integer);
end;
implementation
function StrToAsc(mstr:string):integer;forward;
///////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TSerialControl.Create; //TSerialControl類對象構(gòu)造方法實現(xiàn)區(qū)
begin
inherited Create; //執(zhí)行父類的Create方法
//以下為變量初始化
m_hComm := DWord(-1); //把-1賦給串口操作句柄,并聲明-1為DWord類型
m_SerialSet.BaudRate := CBR_9600; //波特率默認(rèn)值為9600
m_SerialSet.ByteSize := 8; //數(shù)據(jù)位默認(rèn)值為8
m_SerialSet.Parity := NOPARITY; //校驗方式默認(rèn)值為無
m_SerialSet.StopBits := ONESTOPBIT; //停止位默認(rèn)值1
m_SerialSet.TimeOuts.ReadTotalTimeoutMultiplier := 0; //超時
m_SerialSet.TimeOuts.ReadTotalTimeoutConstant := 0; //超時
m_SerialSet.TimeOuts.ReadIntervalTimeout := MAXDWORD; //超時
m_Opened := FALSE; //串口打開結(jié)果默認(rèn)值為FALSE
end;
//////////////////////////////////
//打開指定的串口
//返回: =0表示打開成功,
// -1串口打開失敗,
// -2串口已打開
//////////////////////////////////
function TSerialControl.OpenSerial(CommPort:Integer;ShareMode:Boolean=FALSE):Integer;
var
sCommPort:String;
dwShareMode:DWord;
begin
sCommPort:='\\.\COM'+IntToStr(CommPort); //串口號由函數(shù)參數(shù)CommPort傳遞而來
if m_Opened Then //串口已被打開(被本程序打開過)
begin
Result:=-2;
Exit;
end;
if ShareMode Then //串口是否采用共享方式打開
begin
dwShareMode:=FILE_SHARE_READ;
end else
begin
dwShareMode:=0;
end;
m_hComm := CreateFile( //創(chuàng)建文件(串口),取得操作句柄
PChar(sCommPort), //文件名稱
//'\\.\COM10',
GENERIC_READ or GENERIC_WRITE, //操作方式(讀或?qū)?
dwShareMode, //共享方式
nil, //SD
OPEN_EXISTING, //文件創(chuàng)建方法
FILE_ATTRIBUTE_NORMAL, //文件屬性
0); //handle to template file
if( m_hComm = INVALID_HANDLE_VALUE ) then //串口打開失敗
begin
Result:=-1;
Exit;
end;
m_Opened:=True; //設(shè)置串口打開標(biāo)志
Result:=0; //成功返回
end;
///////////////////////////
//設(shè)置串口參數(shù)
//////////////////////////
procedure TSerialControl.setSerialStatus;
var
dcbComm:DCB;
ctosComm:CommTimeOuts;
begin
GetCommState(m_hComm,dcbComm); //Windows.GetCommState(hFile:Cardinal,var lpBCD:_BCD):LongBool;
dcbComm.Flags := dcbComm.Flags and $FFFFFBFF;
dcbComm.BaudRate := m_SerialSet.BaudRate;
dcbComm.ByteSize := m_SerialSet.ByteSize;
dcbComm.Parity := m_SerialSet.Parity;
dcbComm.StopBits := m_SerialSet.StopBits;
SetCommState(m_hComm, dcbComm); //Windows.SetCommState(hFile:Cardinal,const lpBCD:_BCD):LongBool;
//GetCommState(m_hComm,dcbComm); //Windows.GetCommState(hFile:Cardinal,var lpBCD:_BCD):LongBool;
GetCommTimeouts(m_hComm,ctosComm); //Windows.GetCommTimeouts(hFile:Cardinal,var lpCommTimeOuts:_COMMTIMEOUTS):LongBool;
ctosComm.ReadIntervalTimeout:=m_SerialSet.TimeOuts.ReadIntervalTimeout;
ctosComm.ReadTotalTimeoutMultiplier := m_SerialSet.TimeOuts.ReadTotalTimeoutMultiplier;
ctosComm.ReadTotalTimeoutConstant := m_SerialSet.TimeOuts.ReadTotalTimeoutConstant;
SetCommTimeouts(m_hComm,ctosComm); //Windows.SetCommTimeouts(hFile:Cardinal,const lpCommTimeOuts:_COMMTIMEOUTS):LongBool;
end;
///////////////////////////
//關(guān)閉串口
//////////////////////////
function TSerialControl.CloseSerial:Integer;
begin
if m_Opened then
begin
CloseHandle(m_hComm); //利用創(chuàng)建文件(串口)時的句柄關(guān)閉串口
m_Opened:=FALSE;
end;
Result:=0;
end;
///////////////////////////////////
//從串口讀入指定字節(jié)數(shù)的數(shù)據(jù)
//返回: >0表示返回的字節(jié)數(shù),
// -1表示讀錯誤,
// -2表示超時
//////////////////////////////////
function TSerialControl.ReadCom(var RetStr:string; //讀到字節(jié)緩沖區(qū)
var TotalBytes:Integer; //讀取到的字節(jié)數(shù)
NumberOfBytesToRead:DWord; //需要讀取的字節(jié)數(shù)
PurgeFlag:Boolean=FALSE; //是否先清緩沖區(qū)
TimeOut:DWord=1000 //超時設(shè)置(默認(rèn)為1000ms)
):Integer;
var
buffer: array[1..500] of char; //讀緩沖區(qū)(臨時)
dwTimer: DWord; //開始時間
crTimer: DWord; //當(dāng)前時間
iReadNum: DWord; //當(dāng)前讀取到的字節(jié)數(shù)
iTotalNum: DWord; //總計讀到字節(jié)數(shù)
Readsuccess:Boolean; //讀取成功狀態(tài)標(biāo)志
i: Integer; //循環(huán)變量
Begin
result := 0; //函數(shù)返回值預(yù)設(shè)
iReadNum := 0;
iTotalNum := 0;
TotalBytes:= 0;
RetStr := '';
if PurgeFlag then
begin
PurgeComm(m_hComm, PURGE_RXCLEAR or PURGE_RXABORT); //清除數(shù)據(jù)緩沖區(qū)
end;
dwTimer := GetTickCount; //計時開始
// SetLength(bStr,Integer(NumberOfBytesToRead+1)); //設(shè)置動態(tài)數(shù)據(jù)長度
while True do
begin
Readsuccess := ReadFile(m_hComm, //操作句柄
buffer, //數(shù)據(jù)緩沖區(qū)
NumberOfBytesToRead, //要讀取的字節(jié)長度
iReadNum, //實際讀取的字節(jié)長度
nil); //overlapped buffer
if(not ReadSuccess) then //讀取失敗
begin
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -