⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uscontrol.~pas

📁 这个是DELPHI环境下的收发短信程序的源代码。目前发送短信已经做的很完美了
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
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 + -