大家好,在网上买了一个SIM900A模块,想让他收到一条短信后自动回复,我设定收到的短信是第十一条,一旦收到第十一条短信,自动回复给对方一条短信,然后再将第十一条短信删除,如此循环。但是,问题就出来了,我调用 sim900a_send_cmd(u8 *cmd,u8 *ack,u16 waittime)这个函数,但是SIM900A模块收到短信后,会自动生成一条语句+CMTI: "SM",11(假如收到的是第十一条短信),不需要发送命令,不知道我这样用对吗sim900a_send_cmd(NULL,"+CMTI: "SM",11",200)。还有就是,我在sim900a.c里面定义了一个全局变量u8 pnum[14]用于储存电话号码,这样定义不知道对不对?弄好了这些,我向SIM900A发送一条短信,但是收不到回复,弄了半天也不知道问题在哪里,求指教。
u8 pnum[14]; //存储电话号码
//向sim900a发送命令
//cmd:发送的命令字符串(不需要添加回车了),当cmd<0XFF的时候,发送数字(比如发送0X1A),大于的时候发送字符串.
//ack:期待的应答结果,如果为空,则表示不需要等待应答
//waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果)
// 1,发送失败
u8 sim900a_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
u8 res=0;
USART3_RX_STA=0;
if((u32)cmd<=0XFF)
{
while((USART3->SR&0X40)==0);//等待上一次数据发送完成
USART3->DR=(u32)cmd;
}else u3_printf("%s
",cmd);//发送命令
if(ack&&waittime) //需要等待应答
{
while(--waittime) //等待倒计时
{
delay_ms(10);
if(USART3_RX_STA&0X8000)//接收到期待的应答结果
{
if(sim900a_check_cmd(ack))break;//得到有效数据
USART3_RX_STA=0;
}
}
if(waittime==0)res=1;
}
return res;
}
u8 sim900a_sms_read_test(void)
{
u8 *p,*p1,*p2,*tmpp;
u8 timex=0,i=0;
u8 msgindex[3];
u8 msglen=0;
u8 msgmaxnum=0; //短信最大条数
u8 key=0;
u8 smsreadsta=0; //是否在短信显示状态
u8 sec[4]="seco"; //用于存储将要发送什么样的雨量测试
u8 min[4]="minu";
u8 date[4]="date";
u8 hour[4]="hour";
u8 pcon[4];//存储电话号码跟短信内容
p=mymalloc(SRAMIN,200);//申请200个字节的内存
while(1)
{
sprintf((char*)p,"AT+CMGR=%s",msgindex);
if(sim900a_send_cmd(p,"+CMGR:",200)==0)//读取短信
{
p1=(u8*)strstr((const char*)(USART3_RX_BUF),",");
p2=(u8*)strstr((const char*)(p1+2),""");
p2[0]=0;//加入结束符
sim900a_unigbk_exchange(p1+2,p,0); //将unicode字符转换为gbk码
tmpp=p;
for(i=0;i<14;i++)
{
pnum=*p;
p++;
}
p=tmpp;
p1=(u8*)strstr((const char*)(p2+1),"/");
p2=(u8*)strstr((const char*)(p1),"+");
p2[0]=0;//加入结束符
p1=(u8*)strstr((const char*)(p2+1),"
"); //寻找回车符
sim900a_unigbk_exchange(p1+2,p,0); //将unicode字符转换为gbk码
tmpp=p;
for(i=0;i<4;i++)
{
pcon=*p;
p++;
}
p=tmpp;
smsreadsta=1; //标记有显示短信内容
}
USART3_RX_STA=0;
if(timex==0) //2.5秒左右更新一次
{
if(sim900a_send_cmd("AT+CPMS?","+CPMS:",200)==0) //查询优选消息存储器
{
p1=(u8*)strstr((const char*)(USART3_RX_BUF),",");
p2=(u8*)strstr((const char*)(p1+1),",");
p2[0]='/';
USART3_RX_STA=0;
}
}
if((timex%20)==0)LED0=!LED0;//200ms闪烁
timex++;
delay_ms(10);
if(USART3_RX_STA&0X8000)sim_at_response(1);//检查从GSM模块接收到的数据
myfree(SRAMIN,p);
if(strcmp(sec,pcon)==0)
return 1;
else if(strcmp(min,pcon)==0)
return 2;
else if(strcmp(hour,pcon)==0)
return 3;
else if(strcmp(date,pcon)==0)
return 4;
else return 0;
}
}
//测试短信发送内容(70个字[UCS2的时候,1个字符/数字都算1个字])
const u8* sim900a_test_msg="你好,这是一条测试短信";
//SIM900A发短信测试
void sim900a_sms_send_test(void)
{
u8 *p,*p1,*p2;
u8 phonebuf[14],i=0; //号码缓存
u8 pohnenumlen=0; //号码长度,最大15个数
u8 timex=0;
u8 key=0;
u8 smssendsta=0; //短信发送状态,0,等待发送;1,发送失败;2,发送成功
p=mymalloc(SRAMIN,100); //申请100个字节的内存,用于存放电话号码的unicode字符串
p1=mymalloc(SRAMIN,300);//申请300个字节的内存,用于存放短信的unicode字符串
p2=mymalloc(SRAMIN,100);//申请100个字节的内存 存放:AT+CMGS=p1
while(1)
{
for(i=0;i<14;i++)
phonebuf=pnum;
smssendsta=1;
sim900a_unigbk_exchange(phonebuf,p,1); //将电话号码转换为unicode字符串
sim900a_unigbk_exchange((u8*)sim900a_test_msg,p1,1);//将短信内容转换为unicode字符串.
sprintf((char*)p2,"AT+CMGS="%s"",p);
if(sim900a_send_cmd(p2,">",200)==0) //发送短信命令+电话号码
{
u3_printf("%s",p1); //发送短信内容到GSM模块
if(sim900a_send_cmd((u8*)0X1A,"+CMGS:",1000)==0)smssendsta=2;//发送结束符,等待发送完成(最长等待10秒钟,因为短信长了的话,等待时间会长一些)
}
phonebuf[pohnenumlen]=0;
if((timex%20)==0)LED0=!LED0;//200ms闪烁
timex++;
delay_ms(10);
if(USART3_RX_STA&0X8000)sim_at_response(1);//检查从GSM模块接收到的数据
}
myfree(SRAMIN,p);
myfree(SRAMIN,p1);
myfree(SRAMIN,p2);
}
u8 sim900a_sms_test(void)
{
u8 key;
u8 timex=0;
if(sim900a_send_cmd("AT+CMGF=1","OK",200))return 1; //设置文本模式
if(sim900a_send_cmd("AT+CSCS="UCS2"","OK",200))return 2; //设置TE字符集为UCS2
if(sim900a_send_cmd("AT+CSMP=17,0,2,25","OK",200))return 3; //设置短消息文本模式参数
while(1)
{
if(sim900a_send_cmd(NULL,"+CMTI: "SM",11",200)==0)
{
sim900a_sms_read_test();
delay_ms(5);
sim900a_sms_send_test();
delay_ms(5);
timex=0;
sim900a_send_cmd("AT+CMGD=11","OK",200);
}
timex++;
if(timex==20)
{
timex=0;
LED0=!LED0;
}
delay_ms(10);
}
sim900a_send_cmd("AT+CSCS="GSM"","OK",200); //设置默认的GSM 7位缺省字符集
return 0;
}
{
u8 key=0;
u8 timex=0;
u8 sim_ready=0;
sim900a_send_cmd("AT","OK",100);
key+=sim900a_send_cmd("ATE0","OK",200);//不回显
while(1)
{
delay_ms(10);
if(sim_ready)//SIM卡就绪.
{
sim900a_sms_test(); //短信测试
timex=0;
}
if(timex==0) //2.5秒左右更新一次
{
if(sim900a_gsminfo_show(40,225)==0)sim_ready=1;
else sim_ready=0;
}
if((timex%20)==0)LED0=!LED0;//200ms闪烁
timex++;
}
}
原子哥,我知道,但是每当我的SIM900A模块收到短信后,他不自动回复短信啊,这是什么原因,是我的电话号码读取不对吗?
---------------------------------
短信箱满了,就不会回复。你看看是不是满了
一周热门 更多>