?? 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 //參置串口參數
BaudRate:DWord; //波特率
ByteSize:Byte; //數據位
Parity:Byte; //校檢位
StopBits:Byte; //停止位
TimeOuts:COMMTIMEOUTS; //超時時間
end;
type
TSerialControl = Class
protected
m_hComm:DWord; //定義串口操作句柄
public
m_Opened:Boolean; //定義串口打開結果
m_SerialSet:TSerialSet; //定義串口參數設置記錄類變量
Constructor
Create; //TSerialControl構造方法聲明
published //函數與過程聲明
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類對象構造方法實現區
begin
inherited Create; //執行父類的Create方法
//以下為變量初始化
m_hComm := DWord(-1); //把-1賦給串口操作句柄,并聲明-1為DWord類型
m_SerialSet.BaudRate := CBR_9600; //波特率默認值為9600
m_SerialSet.ByteSize := 8; //數據位默認值為8
m_SerialSet.Parity := NOPARITY; //校驗方式默認值為無
m_SerialSet.StopBits := ONESTOPBIT; //停止位默認值1
m_SerialSet.TimeOuts.ReadTotalTimeoutMultiplier := 0; //超時
m_SerialSet.TimeOuts.ReadTotalTimeoutConstant := 0; //超時
m_SerialSet.TimeOuts.ReadIntervalTimeout := MAXDWORD; //超時
m_Opened := FALSE; //串口打開結果默認值為FALSE
end;
//////////////////////////////////
//打開指定的串口
//返回: =0表示打開成功,
// -1串口打開失敗,
// -2串口已打開
//////////////////////////////////
function TSerialControl.OpenSerial(CommPort:Integer;ShareMode:Boolean=FALSE):Integer;
var
sCommPort:String;
dwShareMode:DWord;
begin
sCommPort:='\\.\COM'+IntToStr(CommPort); //串口號由函數參數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( //創建文件(串口),取得操作句柄
PChar(sCommPort), //文件名稱
//'\\.\COM10',
GENERIC_READ or GENERIC_WRITE, //操作方式(讀或寫)
dwShareMode, //共享方式
nil, //SD
OPEN_EXISTING, //文件創建方法
FILE_ATTRIBUTE_NORMAL, //文件屬性
0); //handle to template file
if( m_hComm = INVALID_HANDLE_VALUE ) then //串口打開失敗
begin
Result:=-1;
Exit;
end;
m_Opened:=True; //設置串口打開標志
Result:=0; //成功返回
end;
///////////////////////////
//設置串口參數
//////////////////////////
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;
///////////////////////////
//關閉串口
//////////////////////////
function TSerialControl.CloseSerial:Integer;
begin
if m_Opened then
begin
CloseHandle(m_hComm); //利用創建文件(串口)時的句柄關閉串口
m_Opened:=FALSE;
end;
Result:=0;
end;
///////////////////////////////////
//從串口讀入指定字節數的數據
//返回: >0表示返回的字節數,
// -1表示讀錯誤,
// -2表示超時
//////////////////////////////////
function TSerialControl.ReadCom(var RetStr:string; //讀到字節緩沖區
var TotalBytes:Integer; //讀取到的字節數
NumberOfBytesToRead:DWord; //需要讀取的字節數
PurgeFlag:Boolean=FALSE; //是否先清緩沖區
TimeOut:DWord=1000 //超時設置(默認為1000ms)
):Integer;
var
buffer: array[1..500] of char; //讀緩沖區(臨時)
dwTimer: DWord; //開始時間
crTimer: DWord; //當前時間
iReadNum: DWord; //當前讀取到的字節數
iTotalNum: DWord; //總計讀到字節數
Readsuccess:Boolean; //讀取成功狀態標志
i: Integer; //循環變量
Begin
result := 0; //函數返回值預設
iReadNum := 0;
iTotalNum := 0;
TotalBytes:= 0;
RetStr := '';
if PurgeFlag then
begin
PurgeComm(m_hComm, PURGE_RXCLEAR or PURGE_RXABORT); //清除數據緩沖區
end;
dwTimer := GetTickCount; //計時開始
// SetLength(bStr,Integer(NumberOfBytesToRead+1)); //設置動態數據長度
while True do
begin
Readsuccess := ReadFile(m_hComm, //操作句柄
buffer, //數據緩沖區
NumberOfBytesToRead, //要讀取的字節長度
iReadNum, //實際讀取的字節長度
nil); //overlapped buffer
if(not ReadSuccess) then //讀取失敗
begin
Result := -1;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -