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

📄 shortsmsactiveimpl1.pas

📁 利用AT指令,直接控制GSM的控制.实现
💻 PAS
📖 第 1 页 / 共 4 页
字号:
        begin
          DoEvents;
          CREGNum:= Pos(#13 + #10 + '+CREG: 0,1',ReceiveData);
          ATNum:= Pos('AT+CREG?',ReceiveData);
          OKNum:= Pos(#13 + #10 + 'OK' + #13 + #10,ReceiveData);
          ErrNum:= Pos(#13 + #10 + 'ERROR' + #13 + #10,ReceiveData);

          if (ATNum > 0) and (CREGNum > ATNum) and (OKNum > CREGNum) then
          begin
            Result:= 0;
            IfExecCmd:= False;
            Delete(ReceiveData,ATNum,OKNum - ATNum + 6);
            if Trim(ReceiveData) = '' then
              ReceiveData:= '';
            Exit;
          end
          else if (ATNum > 0) and (ErrNum > ATNum) and (CREGNum < 1) then
          begin
            IfExecCmd:= False;
            Delete(ReceiveData,ATNum,ErrNum - ATNum + 9);
            if Trim(ReceiveData) = '' then
              ReceiveData:= '';
            Exit;
          end;
        end;
      end;

      IfExecCmd:= False;
      ReceiveData:= '';
    end
    else
      Result:= -2;
  except
    IfExecCmd:= False;
    ReceiveData:= '';
    Result:= -3;
  end;
end;

/////////////////////////////////////////////////////////////
//说  明:此函数是用来判断模块是否准备就绪
//函数名:GetModemCPIN
//参  数:无
//返回值:Shortint
//        0:就绪
//        -1:没有就绪
//        -2:模块忙
//        -3:串口可能没有打开
//作  者:卞伟    2003年6月
/////////////////////////////////////////////////////////////
function TShortSMSActiveX.GetModemCPIN: Smallint;
var
  OutData: PChar;
  CPINNum,ATNum: Integer;
  StartTime: TDateTime;
  ErrNum:    Integer;
begin
  Result:= -1;
  try
    OutData:= 'AT+CPIN?' + #13 + #10;
    if not IfExecCmd then
    begin
      IfExecCmd:= True;
      if Comm1.WriteCommData(OutData,Length(OutData)) then
      begin
        StartTime:= Now();

        while Now() <= StartTime + 1 * (1/24/60/60) do
        begin
          DoEvents;
          CPINNum:= Pos(#13 + #10 + '+CPIN: READY' + #13 + #10,ReceiveData);
          ATNum:= Pos('AT+CPIN?',ReceiveData);
          ErrNum:= Pos(#13 + #10 + 'ERROR' + #13 + #10,ReceiveData);

          if CPINNum > 0 then
          begin
            Result:= 0;
            IfExecCmd:= False;
            Delete(ReceiveData,ATNum,CPINNum - ATNum + 16);
            if (Trim(ReceiveData) = '') or (Trim(ReceiveData) = 'OK') then
              ReceiveData:= '';
            Exit;
          end
          else if (ATNum > 0) and (ErrNum > ATNum) and (CPINNum < 1) then
          begin
            IfExecCmd:= False;
            Delete(ReceiveData,ATNum,ErrNum - ATNum + 9);
            if Trim(ReceiveData) = '' then
              ReceiveData:= '';
            Exit;
          end;
        end;
      end;

      IfExecCmd:= False;
      ReceiveData:= '';
    end
    else
      Result:= -2;
  except
    IfExecCmd:= False;
    ReceiveData:= '';
    Result:= -3;
  end;
end;

/////////////////////////////////////////////////////////////
//说  明:此函数是用来设置短信中心号码
//函数名:SetModemCSCA
//参  数:Value: WideString;  短信中心号码
//返回值:ShortInt
//        0:成功
//        -1:失败
//        -2:模块忙
//        -3:串口可能没有打开
//作  者:卞伟    2003年6月
/////////////////////////////////////////////////////////////
function TShortSMSActiveX.SetModemCSCA(const Value: WideString): Smallint;
var
  OutData: string;
  ATNum,OKNum: Integer;
  StartTime: TDateTime;
  ErrNum:    Integer;
begin
  Result:= -1;
  try
    OutData:= 'AT+CSCA=' + Value + #13 + #10;
    if not IfExecCmd then
    begin
      IfExecCmd:= True;
      if Comm1.WriteCommData(PChar(OutData),Length(PChar(OutData))) then
      begin
        StartTime:= Now();

        while Now() <= StartTime + 1 * (1/24/60/60) do
        begin
          DoEvents;
          OKNum:= Pos(#13 + #10 + 'OK' + #13 + #10,ReceiveData);
          ATNum:= Pos('AT+CSCA=',ReceiveData);
          ErrNum:= Pos(#13 + #10 + 'ERROR' + #13 + #10,ReceiveData);

          if (ATNum > 0) and (OKNum > ATNum) then
          begin
            Result:= 0;
            IfExecCmd:= False;
            Delete(ReceiveData,ATNum,OKNum - ATNum + 6);
            if Trim(ReceiveData) = '' then
              ReceiveData:= '';
            Exit;
          end
          else if (ATNum > 0) and (ErrNum > ATNum) then
          begin
            IfExecCmd:= False;
            Delete(ReceiveData,ATNum,ErrNum - ATNum + 9);
            if Trim(ReceiveData) = '' then
              ReceiveData:= '';
            Exit;
          end;
        end;
      end;

      IfExecCmd:= False;
      ReceiveData:= '';
    end
    else
      Result:= -2;
  except
    IfExecCmd:= False;
    ReceiveData:= '';
    Result:= -3;
  end;
end;

/////////////////////////////////////////////////////////////
//说  明:此函数是用来设置PDU格式
//函数名:SetModemCMGF
//参  数:Value: TSMSCMGF;  PDU格式
//        1:TEXT格式
//        0:PDU格式
//返回值:Shortint
//        0:成功
//        -1:失败
//        -2:模块忙
//        -3:串口可能没有打开
//作  者:卞伟    2003年6月
/////////////////////////////////////////////////////////////
function TShortSMSActiveX.SetModemCMGF(Value: TSMSCMGF): Smallint;
var
  OutData: string;
  OKNum,ATNum: Integer;
  StartTime: TDateTime;
begin
  Result:= -1;
  try
    OutData:= 'AT+CMGF=' + IntToStr(Value) + #13 + #10;
    if not IfExecCmd then
    begin
      IfExecCmd:= True;
      if Comm1.WriteCommData(PChar(OutData),Length(PChar(OutData))) then
      begin
        StartTime:= Now();

        while Now() <= StartTime + 1 * (1/24/60/60) do
        begin
          DoEvents;
          OKNum:= Pos(#13 + #10 + 'OK' + #13 + #10,ReceiveData);
          ATNum:= Pos('AT+CMGF=',ReceiveData);

          if (ATNum > 0) and (OKNum > ATNum) then
          begin
            Result:= 0;
            IfExecCmd:= False;
            Delete(ReceiveData,ATNum,OKNum - ATNum + 6);
            if Trim(ReceiveData) = '' then
              ReceiveData:= '';
            Exit;
          end
        end;
      end;

      IfExecCmd:= False;
      ReceiveData:= '';
    end
    else
      Result:= -2;
  except
    Result:= -3;
    IfExecCmd:= False;
    ReceiveData:= '';
  end;
end;

/////////////////////////////////////////////////////////////
//说  明:此函数是用来发送短信
//函数名:SendInfo
//参  数:1、HandNum: WideString 对方手机号码
//        2、MsgInfo: WideString 要发送的内容
//返回值:Shortint
//        0:成功
//        -1:发送短信失败
//        -2:模块忙
//        -3:短信内容超长或为空
//        -4:设置短信发送模式失败
//        -5:发送失败,并且可能需要重新设置发送模式
//        -6:发送短信结果没有返回,可能与模块的连接终止
//作  者:卞伟    2003年2月
/////////////////////////////////////////////////////////////
function TShortSMSActiveX.SendInfo(const HandNum,
  Info: WideString): Smallint;
var
  OutData: string;
  TempHandNum: string;
  TempInfo: string;

  ATNum,OKNum,CMGSNum: Integer;
  StartTime: TDateTime;
  CMSErrNum,CMEErrNum,ErrNum: Integer;
begin
  if Pos('86',HandNum) = 1 then
    TempHandNum:= '+' + HandNum
  else if Pos('+86',HandNum) = 1 then
    TempHandNum:= HandNum
  else
    TempHandNum:= '+86' + HandNum;

  TempInfo:= Info;
  if IfExecCmd then
    //模块忙
    Result:= -2
{  else if ((Length(TempInfo) > Length(Info)) and (Length(Info) > 60)) or
          ((Length(TempInfo) = Length(Info)) and (Length(Info) > 120)) or
          (Length(Info) < 1) then
    //短信内容超长或为空
    Result:= -3}
  else if ((Length(TempInfo) > Length(Info)) and (Length(Info) > 70)) or
          (Length(Info) < 1) then
    //短信内容超长或为空
    Result:= -3
  else
  begin
    try
//      if Length(TempInfo) > Length(Info) then
//      begin
        //PDU格式
//        if SetModemCMGF(0) < 0 then
//        begin
//          Result:= -4;
//          IfExecCmd:= False;
//          Exit;
//        end;

        IfExecCmd:= True;
        TempInfo:= SMChangHex(TempHandNum,TempInfo + '-BW');
        OutData:= 'AT+CMGS=' + IntToStr(Length(TempInfo) div 2 - 1) + Chr(13) + Chr(10);
        if not Comm1.WriteCommData(PChar(OutData),length(PChar(OutData))) then
        begin
          Result:= -1;
          IfExecCmd:= False;
          Exit;
        end;
{      end
      else if Length(TempInfo) = Length(Info) then
      begin
        //TEXT格式
        if SetModemCMGF(1) < 0 then
        begin
          Result:= -4;
          IfExecCmd:= False;
          Exit;
        end;

        IfExecCmd:= True;
        OutData:= 'AT+CMGS=' + String(TempHandNum) + Chr(13) + Chr(10);
        if not Comm1.WriteCommData(PChar(OutData),length(PChar(OutData))) then
        begin
          Result:= -1;
          IfExecCmd:= False;
          Exit;
        end;
      end;
}
      Sleep(10);
      StartTime:= Now();
      while Now() <= StartTime + 1 * (1/24/60/60) do
      begin
        DoEvents;
        if Length(ReceiveData) > (Length(OutData) + Pos(OutData,ReceiveData)) then
          if Pos('>',ReceiveData) >= Length(OutData) + Pos(OutData,ReceiveData) then
          begin
            Result:= 0;
            Break;
          end;
          if Pos('ERROR',ReceiveData) > (Length(OutData) + Pos(OutData,ReceiveData)) then
          begin
            //showmessage('error');
            Delete(ReceiveData,Pos(OutData,ReceiveData),Pos('ERROR',ReceiveData) - Pos(OutData,ReceiveData) + 6);
            Result:= -5;
            IfExecCmd:= False;
            Exit;
          end;

        Result:= -1;
      end;

      if Result<> 0 then
      begin
        IfExecCmd:= False;
        Exit;
      end;

{      if rightstr(trim(receivedata),1) = '>' then
       showmessage('True')
     else
        showmessage(rightstr(trim(receivedata),1));
}
      OutData:= TempInfo + Chr(26);
      if not Comm1.WriteCommData(PChar(OutData),length(PChar(OutData))) then
      begin
        Result:= -1;
        IfExecCmd:= False;
        Exit;
      end;
      Sleep(10);

      StartTime:= Now();

      while Now() <= StartTime + 60 * (1/24/60/60) do
      begin
        DoEvents;
        OKNum:= Pos(#13 + #10 + 'OK' + #13 + #10,ReceiveData);
        ATNum:= Pos('AT+CMGS=',ReceiveData);
        CMGSNum:= Pos('+CMGS:',ReceiveData);
        CMSErrNum:= Pos('+CMS ERROR:',ReceiveData);
        CMEErrNum:= Pos('+CME ERROR:',ReceiveData);
        ErrNum:= Pos('ERROR',ReceiveData);

        if (CMGSNum > ATNum) and (OKNum > CMGSNum) then
        //发送短信成功
        begin
          Delete(ReceiveData,ATNum,OKNum - ATNum + 6);
          if Trim(ReceiveData) = '' then
            ReceiveData:= '';

          IfExecCmd:= False;
          Result:= 0;
          Exit;
        end
        else if CMSErrNum > ATNum then
        //发送短信失败
        begin
          Delete(ReceiveData,ATNum,CMSErrNum - ATNum + 12);
          if Trim(ReceiveData) = '' then
            ReceiveData:= '';

          Result:= -1;   //发送短信失败
          IfExecCmd:= False;
          Exit;
        end
        else if CMEErrNum > ATNum then
        begin
          Delete(ReceiveData,ATNum,CMEErrNum - ATNum + 12);
          if Trim(ReceiveData) = '' then
            ReceiveData:= '';

          Result:= -1;   //发送短信失败
          IfExecCmd:= False;
          Exit;
        end
        else if ErrNum > ATNum then
        //发送短信失败,并且有可能需要重新设置发送模式及短信中心号码
        begin
          Delete(ReceiveData,ATNum,ErrNum - ATNum + 6);
          if Trim(ReceiveData) = '' then
            ReceiveData:= '';

            Result:= -5;   //发送失败,并且可能需要重新设置发送模式
          IfExecCmd:= False;
          Exit;
        end
        else

⌨️ 快捷键说明

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