OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 16250|回复: 14

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

[复制链接]

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2014-4-15
在线时间
0 小时
发表于 2014-4-16 10:11:09 | 显示全部楼层 |阅读模式
新手,勿喷!求指教!想通过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),"\r");
      p4[0]=0;
      //msgindex[0]=*(p2+1);                    //得到信息存放在SIM卡中的位置
      //msgindex[1]=*(p2+2);
      //msgindex[2]=0;
      sprintf((char*)p,"AT+CMGR=%s\r\n",p2+1);
     
      if(sim900a_send_cmd(p,"+CMGR:",200)==0)  //读取短信,是否读取短信成功
      {
        
        led_op(orange,on);                      //橘色亮表示读取短信成功
        s1=(u8*)strstr((const char*)(USART3_RX_BUF),"\r");//直接读取短信的内容
        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\r\n","OK",100)==0)  //检测是否应答AT指令  默认是回显,所以返回的AT  OK
    {
      
      if(sim900a_send_cmd("ATE0\r\n","OK",100)==0)   //不回显
    
      {
          if(sim900a_send_cmd("AT+CMGF=1\r\n","OK",100)==0)   //设置文本模式
        
          {
              sim900a_send_cmd("AT+CSCS=\"GSM\"\r\n","OK",100) ;//设置GSM字符集
            
              
              sim900a_send_cmd("AT+CNMI=2,1\r\n","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); 
  }
}

GSM.rar

1005.53 KB, 下载次数: 1984

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-16 15:12:47 | 显示全部楼层
回复【楼主位】我要当学霸:
---------------------------------
看了你最后一句话,说用sizeof可以正常运行?
那到底是有问题还是没有?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2014-4-15
在线时间
0 小时
 楼主| 发表于 2014-4-16 17:39:07 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
用sizeof可以运行到if(sim900a_send_cmd(p,"+CMGR:",200)==0) 这里就进不去了,sizeof不是返回的是变量所占的字节数吗?应该是一个固定的值吧,为什么用sizeof的话,sim900a_init()还能正常运行?这不科学啊!用strlen应该没错,但是直接就卡在p1=(u8*)sim900a_check_cmd("+CMTI:");想不通,实在想不通。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-16 23:36:38 | 显示全部楼层
回复【3楼】我要当学霸:
---------------------------------
仿真一下,观察下len的值,就知道问题了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2014-4-15
在线时间
0 小时
 楼主| 发表于 2014-4-17 10:52:44 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥,我观察了len的值,sizeof()是固定的值,是不行的,sim900a_init()函数有错误,if语句后面误加了分号,所以导致了前面的问题。。。。
现在我全部改过来了,sim900a_init()执行不了,不知道哪里又出问题了,囧。。。上传了工程,麻烦帮我看下好吗?我想问一个问题,就是GSM这个模块接收AT指令时,对于字符间的间隔时间有什么要求吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-17 21:58:19 | 显示全部楼层
回复【5楼】我要当学霸:
---------------------------------
有时间再看吧。最近比较忙。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-17 21:59:08 | 显示全部楼层
接收AT指令,比如A+T,这样的,对时间间隔有要求的,你连续发就是了,不要隔开半天才发。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2014-4-15
在线时间
0 小时
 楼主| 发表于 2014-4-18 20:45:16 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
我串口发送函数是:
void u3_printf(char *buf)
{
  u16 i;
  u8 len=strlen(buf);
  for(i=0;i<len;i++)
  {
    USART3->DR=buf;
    delay_ms(10); 
  }
}
sim900a_send_cmd(p,"+CMGR:",200)读取短信这个命令可以正常执行,而且可以正确的读出短信内容,但是其他的指令好像就不能执行,都是用的同一个发送函数,为什么?麻烦原子哥~
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-18 23:06:24 | 显示全部楼层
回复【8楼】我要当学霸:
---------------------------------
你delay 10ms干嘛?
把delay 10ms改为:
while((USART1->SR&0X40)==0);//等待发送完毕
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2014-4-15
在线时间
0 小时
 楼主| 发表于 2014-4-21 15:00:09 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
改成那样又不能收短信了,想死的心都有了,一切又回到原点了。。。是不是像GSM这种模块收发比较频繁的场合串口发送一定要采用DMA方式啊?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-21 19:58:48 | 显示全部楼层
回复【10楼】我要当学霸:
---------------------------------
不一定啊
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2014-4-15
在线时间
0 小时
 楼主| 发表于 2014-4-24 20:36:56 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
终于调试成功了!谢谢原子哥!发现的问题主要是延时的问题,解决方法是在sim900a初始化完后,加一个delay_ms(1000)的延时,还有在读完短信后、发送短信前也加delay_ms(1000)的延时,可见延时的重要性啊!学习了!
回复 支持 反对

使用道具 举报

47

主题

146

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2013-8-8
在线时间
0 小时
发表于 2014-5-17 18:30:40 | 显示全部楼层
问下哈  你的问题解决了吗  
我出现了这样的问题  可否指教下哈
请问下  当GSM收到短信时,想把他读取出来,再发送到指定的号码上,参考了原子哥的程序  可为什么会卡死在这句上呢(红色)
      p1=(u8*)strstr((const char*)(GsmRcv),",");
      p2=(u8*)strstr((const char*)(p1+2),"\"");
      p2[0]=0;//?????á??·?
   
        p1=(u8*)strstr((const char*)(p2+1),"/");
      p2=(u8*)strstr((const char*)(p1),"+");
      p2[0]=0;//?????á??·?
        
        p1=(u8*)strstr((const char*)(p2+1),"\r"); //?°??????·?
        p=p1+2;
   send_message(p);
___诺现在就觉得失望无力,未来那么远该怎么扛。
回复 支持 反对

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2016-1-4
在线时间
26 小时
发表于 2016-5-16 19:34:04 | 显示全部楼层
我的解决不了啊
回复 支持 反对

使用道具 举报

15

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2016-1-18
在线时间
61 小时
发表于 2017-4-18 14:25:42 | 显示全部楼层
你好,我现在做的也是收到短信然后读取对应的信息,再发送相关传感器数据到手机,请问能分享一下你的程序吗?我的邮箱936679030@qq.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-22 01:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表