SIM900A的问题

2019-07-21 00:48发布

大家好,在网上买了一个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;


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。