搞过短信猫的达人请进.

cp1982 2010-11-18 05:26:34
小弟最近的系统需要用到一些短信功能,发送信息已经做好,但是接收信息就出问题了,这是小弟从网上找到的一段代码,这段代码只能接收最后一条或是最后一两条,但是怎么样才能接收未读短信呢,我试着把SendData := 'AT+CMGL=4'+chr(13);这句中的4用0,1,2,3,4,5试过,都不行,都不能得到未读短信,还有这个函数只能读一条短信,要是有多条未读怎么办,请高人指教
function TSMSControl.CheckInPdu:boolean;
var
I,J,K: Integer;
ReceData:string;
ReceDataBack:string;
SendData:string;
strTmp:string;
StratIndexFlag:boolean;
strlen:integer;
iNum:integer;
iRet:integer;

begin
result := FALSE;
SComm.purgeReadWrite(0);
SComm.purgeReadWrite(1);
SendData := 'AT+CMGL=4'+chr(13);
SComm.WriteCom(SendData,0,FALSE,200);
SComm.ReadCom(ReceData,iNum,6,FALSE,500);
if copy(ReceData,4,3) <> 'CMG' then exit;
iRet := SComm.ReadCom(ReceData,iNum,14,FALSE,200);
if iRet < 0 then exit;
ReceDataBack := ReceData;
strTmp := '';
StratIndexFlag := FALSE;
RxMsg.Index := '';
j := 0;
for i:=1 to 14 do
begin
if copy(ReceData,i,1) = ',' then
inc(j);
if StratIndexFlag and (copy(ReceData,i,1) <> ',') then
begin
if copy(ReceData,i,1) <> ' ' then
begin
RxMsg.Index := RxMsg.Index + copy(ReceData,i,1) //取得短消息的索引号
end;
end
else
begin
StratIndexFlag := FALSE;
end;
if copy(ReceData,i,1) = ':' then StratIndexFlag := TRUE;
if j = 3 then
begin
for j:=i+1 to 20 do
begin
if copy(ReceData,j,2) = chr(13)+chr(10) then break;
end;
end;
if j>3 then break;
end;
strlen := StrToInt(copy(ReceData,i+1,j-i-1));
strlen := (strlen+10)*2-(iNum-j-1);
iRet := SComm.ReadCom(ReceData,iNum,strlen,FALSE,500);
if iRet = 0 then
begin
ReceDataBack := ReceDataBack + ReceData;
strlen := length(ReceDataBack);
for i:=1 to strlen do
begin
if copy(ReceDataBack,i,2) = chr(13)+chr(10) then break;
end;
i := i+2;
if i < strlen-4 then
begin
ReceData := copy(ReceDataBack,i,strlen-i);
for i:=1 to strlen-i do
begin
if copy(ReceData,i,1) = chr(13) then break;
end;
ReceData := copy(ReceData,1,i-1); //取得PDU编码
strlen := (StrToInt(copy(ReceData,1,2))+2)*2+1;
strTmp := copy(ReceData,strlen,2);
iNum := HexStrToInt(strTmp);
if (iNum mod 2) >0 then inc(iNum);
strlen := strlen + 4;
strTmp := copy(ReceData,strlen,iNum);
RxMsg.Mobile := ExchangeCode(strTmp);
if copy(RxMsg.Mobile,length(RxMsg.Mobile),1) = 'F' then
RxMsg.Mobile := copy(RxMsg.Mobile,1,length(RxMsg.Mobile)-1); //取得发送号码
strlen := strlen + iNum + 4;
strTmp := copy(ReceData,strlen,12);
RxMsg.Date := ExchangeCode(strTmp); //取得发送时间
strlen := strlen + 14;
strTmp := copy(ReceData,strlen,2);
iNum := HexStrToInt(strTmp)*2;
strTmp := copy(ReceData,strlen+2,iNum);
RxMsg.SMSMsg := DeCodeUnicode(strTmp); //取得消息内容
result:=TRUE;
end;

SendData := 'AT+CMGD='+RxMsg.Index+chr(13); //删除当前信息
for i:=0 to 2 do
begin
SComm.WriteCom(SendData,0,FALSE,200);
SComm.ReadCom(ReceData,iNum,6,FALSE,500);
sleep(100);
end;
end;
end;
...全文
112 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
cp1982 2010-11-19
  • 打赏
  • 举报
回复
我试着把上面那个AT+CMGL=4改成AT+CMGF=0,现在连短信都收不到了,怎么回事呢
min250 2010-11-18
  • 打赏
  • 举报
回复
如果别的AT命令都是通的话 你最好测试下
Comm1.WriteCommData('AT+CSAS="8613800471500"' + #13, length('AT+CSAS="8613800471500"' + #13));
Comm1.WriteCommData('AT+CMGF=0' + #13, length('AT+CMGF=0' + #13));
这2个命令 我以前也是AT+CMGL=4 不好使  用过这2个命令之后就好使了 不知道你的是不是也是这回事

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧