关于sim900a收发短信的问题,新手求指教

2019-08-21 12:12发布

新手,勿喷!求指教!想通过sim900a实现一个最基本的功能,就是收到一条特定内容的短信后,自动向指定的手机回复相关的数据,设置了短信提醒功能,sim900a初始化函数执行不了,从而后面的发送短信都过不去,现把一些代码贴出来,麻烦看一下,非常感谢!

这是while死循环
while(1)
  {
    p1=(u8*)sim900a_check_cmd("+CMTI:");
    
    if(p1)                                      //是否收到短信提示,
    {
      led_op(green,on);                        //短信提示,绿灯亮
      //delay_ms(10);
      
      p2=(u8*)strstr((const char*)(p1),",");
      p4=(u8*)strstr((const char*)(p2+1)," ");
      p4[0]=0;
      //msgindex[0]=*(p2+1);                    //得到信息存放在SIM卡中的位置
      //msgindex[1]=*(p2+2);
      //msgindex[2]=0;
      sprintf((char*)p,"AT+CMGR=%s ",p2+1);
     
      if(sim900a_send_cmd(p,"+CMGR:",200)==0)  //读取短信,是否读取短信成功
      {
        
        led_op(orange,on);                      //橘 {MOD}亮表示读取短信成功
        s1=(u8*)strstr((const char*)(USART3_RX_BUF)," ");//直接读取短信的内容
        s2=s1+2;                                        //s2指向接收到短信内容;
        if(strstr((const char*)(s2),"CX"))              //短信内容是否为“CX”,如果是则开始发送短信
        {
          delay_ms(10);
          led_op(red,off);                              //红灯灭表示收到了CX
          sim900a_sms_send();
        }
      }
    }
  }
这是sim900a初始化的函数:初始化函数执行不了
void sim900a_init(void)
{
    
    delay_ms(10);
    if(sim900a_send_cmd("AT ","OK",100)==0)  //检测是否应答AT指令  默认是回显,所以返回的AT  OK
    {
      
      if(sim900a_send_cmd("ATE0 ","OK",100)==0)   //不回显
    
      {
          if(sim900a_send_cmd("AT+CMGF=1 ","OK",100)==0)   //设置文本模式
        
          {
              sim900a_send_cmd("AT+CSCS="GSM" ","OK",100) ;//设置GSM字符集
            
              
              sim900a_send_cmd("AT+CNMI=2,1 ","OK",100);//设置新消息提示
          }
      }
    }
    
  
}
数据接收是采用串口中断中接收,采用原子哥提供的资料
void USART3_IRQHandler(void)
{
    u8 res;    
    if(USART3->SR&(1<<5))//接收到数据
    {  
        res=USART3->DR;  
        if(USART3_RX_STA<USART3_MAX_RECV_LEN) //还可以接收数据
        {
            TIM7->CNT=0;         //计数器清空
            if(USART3_RX_STA==0)TIM7_Set(1); //使能定时器4的中断 
            USART3_RX_BUF[USART3_RX_STA++]=res; //记录接收到的值  
        }else 
        {
             USART3_RX_STA|=1<<15; //强制标记接收完成
        } 
    }    
}
串口发送是自己写的单个字符逐个发送的函数:
void u3_printf(char *buf)
{
  u16 i;
  u8 len=strlen(buf);
  for(i=0;i<len;i++)
  {
    USART3->DR=buf;
    delay_ms(10); 
  }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
正点原子
1楼-- · 2019-08-21 13:37
回复【楼主位】我要当学霸:
---------------------------------
看了你最后一句话,说用sizeof可以正常运行?
那到底是有问题还是没有?
我要当学霸
2楼-- · 2019-08-21 17:13
回复【2楼】正点原子:
---------------------------------
用sizeof可以运行到if(sim900a_send_cmd(p,"+CMGR:",200)==0) 这里就进不去了,sizeof不是返回的是变量所占的字节数吗?应该是一个固定的值吧,为什么用sizeof的话,sim900a_init()还能正常运行?这不科学啊!用strlen应该没错,但是直接就卡在p1=(u8*)sim900a_check_cmd("+CMTI:");想不通,实在想不通。
正点原子
3楼-- · 2019-08-21 21:11
 精彩回答 2  元偷偷看……
我要当学霸
4楼-- · 2019-08-22 02:33
回复【4楼】正点原子:
---------------------------------
原子哥,我观察了len的值,sizeof()是固定的值,是不行的,sim900a_init()函数有错误,if语句后面误加了分号,所以导致了前面的问题。。。。
现在我全部改过来了,sim900a_init()执行不了,不知道哪里又出问题了,囧。。。上传了工程,麻烦帮我看下好吗?我想问一个问题,就是GSM这个模块接收AT指令时,对于字符间的间隔时间有什么要求吗?
正点原子
5楼-- · 2019-08-22 08:31
回复【5楼】我要当学霸:
---------------------------------
有时间再看吧。最近比较忙。
正点原子
6楼-- · 2019-08-22 13:08
接收AT指令,比如A+T,这样的,对时间间隔有要求的,你连续发就是了,不要隔开半天才发。

一周热门 更多>