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

📄 uscontrol.pas

📁 串口和AT指令的编程
💻 PAS
📖 第 1 页 / 共 2 页
字号:
    end;

    for i:=1 to iReadNum do                                                     //字节读取到后串口缓冲自动清空
    begin
      RetStr := RetStr + buffer[i];                                             //将读取到的字节添加到读到字节缓冲区
    end;
    iTotalNum := iTotalNum + iReadNum;

    if iTotalNum >= NumberOfBytesToRead then                                    //如果读取到的字节数大于等于需要读取数返回
    begin
      TotalBytes := iTotalNum;
      Break;
    end;

    crTimer := GetTickCount;
    if ((crTimer - dwTimer) > Timeout) or ((crTimer < dwTimer) and
        (crTimer+(4294967295-dwTimer) > Timeout)) then                          //超时返回
    begin
      TotalBytes := iTotalNum;
      Result:=-2;
      Break;
    end else
    begin
      sleep(1);
    end;
  end;
end;

///////////////////////////////////
//发送指定字节数的数据到串口
//返回:  0表示成功,
//      -1表示错误,
//////////////////////////////////
function TSerialControl.WriteCom(var SendStr:string;                              //要发送字节缓冲区
                                 NumberofBytesToWrite:DWord;                    //要发送的字节数
                                 PurgeFlag:Boolean=FALSE;                       //是否先清缓冲区
                                 TimeOut:DWord=1000                             //超时
                                 ):Integer;
var
  i:integer;
  iWritedNum:DWord;
  buffer:array[1..500] of char;
begin
  if NumberofBytesToWrite = 0 then
  begin
    NumberofBytesToWrite := Length(SendStr);
  end;
  for i:=1 to NumberofBytesToWrite do
  begin
    //buffer[i] := Chr(StrToAsc(Copy(SendStr,i,1)));
    buffer[i] := Chr(ord(SendStr[i]));
  end;


  if PurgeFlag then
  begin
    PurgeComm(m_hComm,PURGE_TXCLEAR or PURGE_TXABORT);                          //清除数据缓冲区
  end;

  WriteFile(m_hComm,                                                            //操作句柄
            buffer,                                                             //数据缓冲区
            NumberOfBytesToWrite,                                               //要写入的字节长度
            iWritedNum,                                                         //实际写入的字节长度
            nil);                                                               //overlapped buffer

  if iWritedNum = NumberOfBytesToWrite then                                     //如果字节全部写入
  begin
    Result:=0;
  end else
  begin
    Result:=-1;
  end;
end;

///////////////////////////////////
//清发送和接收缓冲区
//////////////////////////////////
procedure TSerialControl.purgeReadWrite(RWFlag:Integer);
begin
  if RWFlag=0 then
  begin
    PurgeComm(m_hComm, PURGE_RXCLEAR or PURGE_RXABORT);
  end else
  begin
    PurgeComm(m_hComm,PURGE_TXCLEAR or PURGE_TXABORT);
  end;
end;

///////////////////////////////////
//com pin 4 dtr
///////////////////////////////////
procedure TSerialControl.SetDTR(Status:Boolean);
var
  com_dcb:DCB ;
begin
  GetCommState(m_hComm, com_dcb);
  com_dcb.Flags:=Com_dcb.Flags and (not($03*DTRBit));
  if Status then
  begin
    com_dcb.Flags:=Com_dcb.Flags or (DTR_CONTROL_ENABLE*DTRBit);
  end else
  begin
    Com_Dcb.Flags:=Com_Dcb.Flags or (DTR_CONTROL_DISABLE*DTRBit);
  end;
  SetCommState(m_hcomm, com_dcb);
end;

///////////////////////////////////
//com pin 7 rts
///////////////////////////////////
procedure TSerialControl.SetRTS(Status:Boolean);
var
  com_dcb:DCB ;
begin
  GetCommState(m_hComm, com_dcb);
  com_dcb.Flags:=Com_dcb.Flags and (not($03*RTSBit));
  if Status then
  begin
    com_dcb.Flags:=Com_dcb.Flags or (RTS_CONTROL_ENABLE*RTSBit);
  end else
  begin
    Com_Dcb.Flags:=Com_Dcb.Flags or (RTS_CONTROL_DISABLE*RTSBit);
  end;
  SetCommState(m_hcomm, com_dcb);
end;

///////////////////////////////////
//
///////////////////////////////////
procedure TSerialControl.GetCtsDsr(var CTSStatus,DSRStatus:Boolean);
var
  dwStatus:DWord;
begin
  GetCommModemStatus(m_hComm,dwStatus);
  if (dwStatus and MS_CTS_ON)>0 then
  begin
    CTSStatus:=True;
  end else
  begin
    CTSStatus:=FALSE;
  end;

  if (dwStatus and MS_DSR_ON)>0 then
  begin
    DsrStatus:=True;
  end else
  begin
    DsrStatus:=FALSE;
  end;
end;

///////////////////////////////////
//
///////////////////////////////////
function TSerialControl.WaitForCTSDSR(var CTSStatus,DSRStatus:Boolean):Boolean;
var dwMask,dwStatus:DWord;
    bRet:Boolean;
begin
    SetCommMask(m_hComm,EV_CTS and EV_DSR);
    bRet:=FALSE;
    WaitCommEvent(m_hComm,dwMask,nil);
    if (dwMask and EV_CTS)<>0 then
    begin
        GetCommModemStatus(m_hComm,dwStatus);
        if (dwStatus and MS_CTS_ON)<>0 then
        begin
            CTSStatus:=True;
        end else
        begin
            CTSStatus:=FALSE;
        end;
        bRet:=True;
    end;
    if (dwMask and EV_DSR)<>0 then
    begin
        GetCommModemStatus(m_hComm,dwStatus);
        if (dwStatus and MS_CTS_ON)<>0 then
        begin
            DSRStatus:=True;
        end else
        begin
            DSRStatus:=FALSE;
        end;
        bRet:=True;
    end;
    {MS_CTS_ON CTS为ON
  MS_DSR_ON DSR为ON
  MS_RING_ON RING为ON
  MS_ELSD_ON RLSD为ON}
    Result:=bRet;
end;

function StrToAsc(mstr:string):integer;                                         //返回字符的ASC值
begin
  Result := 126 - CompareStr('~',mstr);
end;

end.



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -