📄 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -