单片机驱动GSM模块,遇到了个很棘手的问题!【已解决】

[复制链接]
8886|31
 楼主| 512826028 发表于 2015-1-25 22:48 | 显示全部楼层
为了调试方便,我就把AT当做握手信号了,不再使用ATE0这个不利于调试的指令。

握手之后,模块不再疯狂的发送数据,不过,偶尔也是会发送。这个发送,我经过多次测试,有可能导致我的程序进入死循环。还需要再完善,不过,终于可以发送最简单的短信了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 512826028 发表于 2015-1-25 22:53 | 显示全部楼层
本帖最后由 512826028 于 2015-1-25 22:55 编辑

还有另外一个乱码的原因,可能我的发送频率太快了导致的。所以,我尽可能的都在中间间隔了1S。

我把我改良后的代码贴在这里吧。希望可以帮到有类似困惑的朋友。

  1. /*******************************************************************************
  2. *描    述: 此文件包含操作GSM的所有函数
  3. *GSM 模块:SIM900A
  4. *控制芯片:MSP430F149
  5. *
  6. *******************************************************************************/
  7. #include "include.h"

  8. extern uchar USART1BUFF[];//重新声明一下其他函数中定义的USART1BUFF数组

  9. extern void UART_Clear_BUFF(void);
  10. //外部声明过的函数 0 UART1,1 UART2,str为字符串指针
  11. extern void UART_PutStr(uchar uartx, char *str);
  12. extern void UART_PutChar(uchar uartx, char ch);
  13. extern void DelayNms(unsigned char n);
  14. extern void DelayNs(unsigned char n);
  15. extern void led(int i);
  16. extern void GPIO_OUT(uchar px, uchar data8);
  17. extern void UART_Init(uchar uartx);


  18. /*******************************************************************************
  19. *SIM900初始化函数
  20. *
  21. *返回值:无
  22. *测试通过时间:2015年1月22日22:58:54
  23. *******************************************************************************/
  24. void SIM900(void)
  25. {
  26.   
  27.     //第一步   握手
  28.     /*******************************************************
  29.     *不握手,GSM模块会一直向串口发送
  30.     *   RDY
  31.     *   +CFUN: 1
  32.     *   +CPIN: READY
  33.     *会搞乱串口中断,和数据缓冲区。
  34.     *******************************************************/
  35.     UART_Clear_BUFF();
  36.     UART_PutStr(0,"AT\r\n\r\n");
  37.     DelayNs(1);
  38.     while(strstr((char const*)USART1BUFF,"OK")==NULL)
  39.     {
  40.         UART_Clear_BUFF();
  41.         //注意:此处必须为\R\N\R\N!!!
  42.         UART_PutStr(0,"AT\r\n\r\n");
  43.         led(1);
  44.     }
  45.     //GPIO_OUT(P2,0Xf7);//点亮一个LED灯,代表握手成功   
  46.     DelayNs(1);
  47.    
  48.     UART_Clear_BUFF();//
  49.    
  50.     //第二步   检查SIM卡是否存在
  51.     UART_PutStr(0,"AT+CPIN?\r\n\r\n");
  52.     DelayNs(1);
  53.     while(strstr((char const*)USART1BUFF,"OK")==NULL)
  54.     {
  55.         UART_Clear_BUFF();        
  56.         //注意:此处必须为\R\N\R\N!!!
  57.         UART_PutStr(0,"AT+CPIN?\r\n\r\n");
  58.         led(2);  
  59.         //DelayNs(1);      
  60.     }
  61.     GPIO_OUT(P2,0Xfe);
  62.     DelayNs(1);
  63.     UART_Clear_BUFF();//
  64.    
  65.    
  66.     //第三步   设置短信格式为GSM方式
  67.     UART_PutStr(0,"AT+CSCS="GSM"\r\n\r\n");
  68.     DelayNs(1);
  69.     while(strstr((char const*)USART1BUFF,"OK")==NULL)
  70.     {
  71.         UART_Clear_BUFF();        
  72.         //注意:此处必须为\R\N\R\N!!!
  73.         UART_PutStr(0,"AT+CSCS="GSM"\r\n\r\n");
  74.         led(3);
  75.     }
  76.     GPIO_OUT(P2,0Xfb);
  77.     DelayNs(1);
  78.     UART_Clear_BUFF();//
  79.    
  80.     //第四步   设置短信各式为 文本方式
  81.     UART_PutStr(0,"AT+CMGF=1\r\n\r\n");
  82.     DelayNs(1);
  83.     while(strstr((char const*)USART1BUFF,"OK")==NULL)
  84.     {
  85.         UART_Clear_BUFF();        
  86.         //注意:此处必须为\R\N\R\N!!!
  87.         UART_PutStr(0,"AT+CMGF=1\r\n\r\n");
  88.         led(4);        
  89.     }
  90.     GPIO_OUT(P2,0Xf7);
  91.     DelayNs(1);
  92.     UART_Clear_BUFF();//
  93.    
  94. }

  95. /*******************************************************************************
  96. *SIM900发送短信程序
  97. *
  98. *返回值:无
  99. *测试通过时间:2015年1月22日22:58:54
  100. *******************************************************************************/
  101. void SIM900_Send_MSG()
  102. {
  103.     DelayNs(3);
  104.    
  105.     UART_PutStr(0,"AT+CMGS="10086"\r\n\r\n");
  106.     DelayNs(1);
  107.     GPIO_OUT(P2,0Xef);
  108.     DelayNs(3);
  109.    
  110.     UART_PutStr(0,"Hello World!");
  111.    
  112.     GPIO_OUT(P2,0Xbf);   
  113.     DelayNs(3);
  114.     UART_Clear_BUFF();//
  115.    
  116.     UART_PutChar(0,0X1A);//发送短信
  117.    
  118.     GPIO_OUT(P2,0X3c);  //正在发送短信!!!!!  
  119.    
  120.     DelayNs(3);//等待发送结束
  121.    
  122.     while(strstr((char const*)USART1BUFF,"CMGS")==NULL)
  123.     {
  124.         //UART_Clear_BUFF();        
  125.         UART_PutChar(0,0X1A);
  126.         GPIO_OUT(P2,0X7f);
  127.         DelayNs(1);
  128.         GPIO_OUT(P2,0Xff);
  129.         DelayNs(1);  
  130.         GPIO_OUT(P2,0X7f);
  131.         DelayNs(1);  
  132.     }
  133. }


 楼主| 512826028 发表于 2015-1-25 23:05 | 显示全部楼层
额 不知道是自己分数问题,还是怎么回事,自己发帖可以选择50分,而结贴时又显示错误。

自己也不想无满意答案结贴。好无奈。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
acer4736 发表于 2015-1-26 07:47 | 显示全部楼层
进来学习了 呵呵
jinpaidianzi 发表于 2015-1-26 07:55 | 显示全部楼层
向各位大神学习
teabottle 发表于 2015-1-26 07:57 | 显示全部楼层
学习了 没想到还有这么棘手的问题
wangjinlili 发表于 2015-1-26 08:04 | 显示全部楼层
各位都是高手啊  向你们学习
meishizhaoshi 发表于 2015-1-26 08:06 | 显示全部楼层
很值得大家一起来探讨的一个问题
henryetchou 发表于 2015-1-26 09:44 | 显示全部楼层
512826028 发表于 2015-1-25 22:44
额 现在这个乱码的原因找到了。

原来是我一开始都是使用ATE0这个关闭回显当做是握手信号了,后来我为了方 ...

呵~恭喜您糾錯成功,做一個編程員最大的樂趣,不是順順利利沒卡關的把項目完成,而是遇到數個卡關挫敗,從中逐步以自己的思考邏輯去解決問題,這個喜悅跟成就不是一般研讀書本或是聽聽研習就能獲得,gps有冷熱開機、星曆取得、ATAPI命令取NMEA等技術環節,當您要取得計算更精確快速的座標資訊時,其中鑽研的樂趣會越多。
 楼主| 512826028 发表于 2015-1-26 18:51 | 显示全部楼层
henryetchou 发表于 2015-1-26 09:44
呵~恭喜您糾錯成功,做一個編程員最大的樂趣,不是順順利利沒卡關的把項目完成,而是遇到數個卡關挫敗, ...

恩  很认同您说的。后面还要慢慢来,还有GPRS定位在等着我。
rfvdfg 发表于 2015-1-30 10:28 | 显示全部楼层
都是大神!~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部