AT+CPMS? 命令获取到的是当前手机卡储存的短信数量。正常情况下可以当作短信序列号去读取短信,但是如果在你读取短信后,传输到服务器途中,又收到了新短信就会出现问题:
假如你通过上面命令读出来手机卡储存两条短信,你通过 AT+CMGR=2读出位置为 2 的短信,然后发送到服务器中途,又收到一条短信,此时会被储存在位置 3,当你把目前这条短信发送到服务器上,然后通过 AT+CMGD=2 删除之后,
再次通过 AT+CPMS? 获取短信数量,结果还是2,但是实际短信储存的位置序列为 1 和 3。所以我们需要另一种读取短信的方式:
首先读取 手机卡储存的短信数量,当数量大于1条时,写一个循环来读取实际短信
// 伪代码
for(int i=1;i<=50;i++){
printf("AT+CMGR=%d\r\n", i);
if(read_success){
// 记录当前 i
}else{
continue;
}
}
总结就是当用 AT+CPMS? 发现手机上有短信时,就开启一个循环去读取短信,
当 AT+CPMS? 结果为 0 时,证明手机卡没有存储短信。完成已存短信的处理。