📄 sms_pudunit.pas
字号:
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 + -