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