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

📄 sms_pudunit.pas

📁 用串口通信实现手机短信的收发的例子(带源码)
💻 PAS
📖 第 1 页 / 共 3 页
字号:
  CurrState:=ATCMGS_1;    

  sendStrToComm('at+cmgs='+ FCMGSLen +#$D)  //SMScomm.WriteCommData()
end;

procedure TSMSPDUproc.SendSM(mTP_DA, Info: string);
begin
  TP_DA:=mTP_DA;       //号码
  setTP_UD(Info);     //信息
  ReSendCount:=0;
  getPUDStr;
  CurrState:=ATCMGS_1;    

  sendStrToComm('at+cmgs='+ FCMGSLen +#$D);
end;

procedure TSMSPDUproc.sendStrToComm(str:string);
begin
  Inc(ReSendCount);
  tver:=0;
  OTTimer.Enabled:=True;
  SMScomm.WriteCommData(PAnsiChar(str), Length(str));
  if Assigned(FOnSndMonitor) then
  begin
    FOnSndMonitor(Self,str);
  end;
end;

procedure TSMSPDUproc.setActive(const Value:Boolean);
begin
  FActive := Value;
  if Value then //打开串口
  try
    begin
      SMScomm.StopComm;
      SMScomm.StartComm;
      Delay(100);
      resetSMS;
    end
  except
    on ECommsError do
      ShowMessage('串口:' + FCommName + ' 无法打开');
  end
  else
    SMScomm.StopComm;
end;

procedure TSMSPDUproc.SetBaudRate(const Value:DWORD);
begin

  FBaudRate := Value;
  if FActive then
  begin
    SMScomm.StopComm;
    SMScomm.BaudRate := FBaudRate;
    SMScomm.StartComm;
  end
  else
    SMScomm.BaudRate := FBaudRate;

end;

procedure TSMSPDUproc.SetByteSize(const Value:TByteSize);
begin
  FByteSize := Value;

  if FActive then
  begin
    SMScomm.StopComm;
    SMScomm.ByteSize := FByteSize;
    SMScomm.StartComm;
  end
  else
    SMScomm.ByteSize := FByteSize;
end;

procedure TSMSPDUproc.SetCommName(const Value:string);
begin
  FCommName := Value;
  if FActive then
  begin
    SMScomm.StopComm;
    SMScomm.CommName := FCommName;
    SMScomm.StartComm;
  end
  else
    SMScomm.CommName := FCommName;
end;

procedure TSMSPDUproc.SetParity(const Value:TParity);
begin
  FParity := Value;
  if FActive then
  begin
    SMScomm.StopComm;
    SMScomm.Parity := FParity;
    SMScomm.StartComm;
  end
  else
    SMScomm.Parity := FParity;
end;

procedure TSMSPDUproc.setSMSC(const Value:string);
begin
  //无短消息中心号码
  if Length(Value) <= 0 then
  begin
    FSMSC := '';
    exit;
  end;
  //号码加上'86'前缀
  if Length(Value) < 2 then
  begin
    FSMSC := '86' + Value
  end
  else
  begin
    if ((Value[1] = '8') and (Value[2] = '6')) then
    begin
      FSMSC := Value;
    end
    else
    begin
      FSMSC := '86' + Value;
    end;
  end;
end;

procedure TSMSPDUproc.SetStopBits(const Value:TStopBits);
begin
  FStopBits := Value;
end;

procedure TSMSPDUproc.setTP_DA(const Value:string);

begin
  if Length(Value) = 0 then
  begin
    raise Exception.Create('目标号码无效');
    exit;
  end;

  //号码加上'86'前缀
  if Length(Value) < 2 then
  begin
    FTP_DA := '86' + Value
  end
  else
  begin
    if ((Value[1] = '8') and (Value[2] = '6')) then
    begin
      FTP_DA := Value;
    end
    else
    begin
      FTP_DA := '86' + Value;
    end;
  end;
end;

procedure TSMSPDUproc.setTP_DCS(const Value:TTP_DCS);
begin
  FTP_DCS := Value;
end;

procedure TSMSPDUproc.setTP_UD(value:array of Byte);
var
  len:Integer;
begin
  len := Length(value);
  if len > 0 then
  begin
    SetLength(FTP_UDByte, len);
    CopyMemory(FTP_UDByte, @value[0], len);
  end;
end;

procedure TSMSPDUproc.setTP_UD(value:string);
begin
  FTP_UDStr := value;
end;

procedure Register;
begin
  RegisterComponents('System', [TSMSPDUproc])
end;

procedure TSMSPDUproc.SMSReceiveData(Sender:TObject; Buffer:Pointer;
  BufferLength:Word);
var
  i:Integer;
  s,tmp:string;
  rbuf:array[0..255] of byte;
  iPos1,iPos2:integer;
begin
  tver:=0;
  OTTimer.Enabled:=False;
  s := '';
  FillChar(rbuf, 256, #0);
  Move(Buffer^, pchar(@rbuf)^, BufferLength);
  for i := 0 to BufferLength - 1 do
    s := s + chr(rbuf[i]);

  if Assigned(FOnRevMonitor) then
    FOnRevMonitor(Self,s);

   //收到短消息
  if Pos('+CMTI',s)>0 then
  begin
    tmp:=RightStr(s,Length(s)-pos(',',s));
    FCurrSMSIndex:=StrToInt(Trim(tmp));   //保存短消息编号
  end;

  case CurrState of
    NORMAL:
      ;
    ATE:
      begin
        if Pos('OK', s) > 0 then //回码成功
        begin
          CurrState := ATCMGF;
          ReSendCount:=0;
          //设置短信模式为PUD
          sendStrToComm('at+cmgf=0' + #$D);
        end
        else if Pos('ERROR', s) > 0 then //回码失败
        begin
          if ReSendCount < 2 then //重发次数少于3次
          begin
            sendStrToComm('ate' + #$D);
          end
          else //超过3次报错
          begin
            ReSendCount := 0;
            OnError(Self,'ATE发送错误');
          end;
        end;
      end;
    ATCMGF:
      begin
        if Pos('OK', s) > 0 then //回码成功
        begin
          CurrState := ATCNMI;
          ReSendCount:=0;
          //设置短信模式为2,2
          sendStrToComm('at+cnmi=2,1,0,0,0' + #$D);
        end
        else if Pos('ERROR', s) > 0 then //回码失败
        begin
          if ReSendCount < 2 then //重发次数少于3次
          begin
            sendStrToComm('at+cmgf=0' + #$D);
          end
          else //超过3次报错
          begin
            ReSendCount := 0;
            OnError(Self,'AT+CMGF发送错误');
          end;
        end;
      end;
    ATCNMI:
      begin
        if Pos('OK', s) > 0 then //回码成功
        begin
          CurrState := NORMAL;
          ReSendCount:=0;
        end
        else if Pos('ERROR', s) > 0 then //回码失败
        begin
          if ReSendCount < 2 then //重发次数少于3次
          begin
            sendStrToComm('at+cnmi=2,1,0,0,0' + #$D);
          end
          else //超过3次报错
          begin
            ReSendCount := 0;
            OnError(Self,'AT+CNMI发送错误');
          end;
        end;

      end;

    ATCMGS_1:
      begin
        if Pos('>', s) > 0 then //回码成功
        begin
          CurrState := ATCMGS_2;
          ReSendCount:=0;
          sendStrToComm(FPUDStr+#$1A);
        end
        else if Pos('ERROR', s) > 0 then //回码失败
        begin
          if ReSendCount < 2 then //重发次数少于3次
          begin
            sendStrToComm('at+cmgs='+ FCMGSLen +#$D);
          end
          else //超过3次报错
          begin
            ReSendCount := 0;
            OnError(Self,'AT+CMGS_1发送错误');
          end;
        end;

      end;
    ATCMGS_2:
      begin
        if Pos('OK', s) > 0 then //回码成功
        begin
          CurrState := NORMAL;
          ReSendCount:=0;
        end
        else if Pos('ERROR', s) > 0 then //回码失败
        begin
          if ReSendCount < 2 then //重发次数少于3次
          begin
            sendStrToComm(FPUDStr+#$1A);
          end
          else //超过3次报错
          begin
            ReSendCount := 0;
            OnError(Self,'AT+CMGS_2发送错误');
          end;
        end;

      end;
    ATCMGR:
      begin
        if Pos('OK', s) > 0 then //回码成功
        begin
          iPos1:=PosEx('+CMGR',s,1);
          ipos1:=PosEx(#$D#$A,s,iPos1);
          ipos1:=iPos1+2;
          ipos2:=PosEx(#$D#$A,s,iPos1);
          tmp:=MidStr(s,iPos1,iPos2-ipos1);
          DecodePUD(tmp);   //解码短消息,触发事件
          if FDelAfterRev then    //读取后删除
          begin
            ReSendCount:=0;
            CurrState:=ATCMGD;
            sendStrToComm('at+cmgd='+inttostr(FCurrSMSIndex)+#$D);
          end
          else
          begin
            CurrState := NORMAL;
            ReSendCount:=0;
            FCurrSMSIndex:=0;
          end;
        end
        else if Pos('ERROR', s) > 0 then //回码失败
        begin
          if ReSendCount < 2 then //重发次数少于3次
          begin
            sendStrToComm('at+cmgr='+inttostr(FCurrSMSIndex)+#$D);
          end
          else //超过3次报错
          begin
            ReSendCount := 0;
            OnError(Self,'AT+CMGR发送错误');
          end;
        end;
      end;
    ATCMGD:
      begin
         if Pos('OK', s) > 0 then //回码成功
        begin
          CurrState := NORMAL;
          ReSendCount:=0;
        end
        else if Pos('ERROR', s) > 0 then //回码失败
        begin
          if ReSendCount < 2 then //重发次数少于3次
          begin
            sendStrToComm('at+cmgd='+inttostr(FCurrSMSIndex)+#$D);
          end
          else //超过3次报错
          begin
            ReSendCount := 0;
            OnError(Self,'AT+CMGD发送错误');
          end;
        end;
      end;
  end;

  if ((CurrState=NORMAL) and (FCurrSMSIndex>0)) then    //在Normal状态读短消息
  begin
    ReSendCount:=0;
    CurrState:=ATCMGR;
    sendStrToComm('at+cmgr='+inttostr(FCurrSMSIndex)+#$D);
  end;

end;

end.

⌨️ 快捷键说明

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