0 单片机驱动GSM模块,遇到了个很棘手的问题!【已解决】 - 第2页 - TI微控制器&处理器论坛 - 德州仪器TI单片机DSP官方技术论坛 - 21ic电子技术开发论坛
发新帖我要提问
12
返回列表
打印

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

[复制链接]
楼主: 512826028
手机看帖
扫描二维码
随时随地手机跟帖
21
512826028|  楼主 | 2015-1-25 22:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
为了调试方便,我就把AT当做握手信号了,不再使用ATE0这个不利于调试的指令。

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

成功.jpg (327.3 KB )

成功.jpg

使用特权

评论回复
22
512826028|  楼主 | 2015-1-25 22:53 | 只看该作者
本帖最后由 512826028 于 2015-1-25 22:55 编辑

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

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

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

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

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


/*******************************************************************************
*SIM900初始化函数
*
*返回值:无
*测试通过时间:2015年1月22日22:58:54
*******************************************************************************/
void SIM900(void)
{
  
    //第一步   握手
    /*******************************************************
    *不握手,GSM模块会一直向串口发送
    *   RDY
    *   +CFUN: 1
    *   +CPIN: READY
    *会搞乱串口中断,和数据缓冲区。
    *******************************************************/
    UART_Clear_BUFF();
    UART_PutStr(0,"AT\r\n\r\n");
    DelayNs(1);
    while(strstr((char const*)USART1BUFF,"OK")==NULL)
    {
        UART_Clear_BUFF();
        //注意:此处必须为\R\N\R\N!!!
        UART_PutStr(0,"AT\r\n\r\n");
        led(1);
    }
    //GPIO_OUT(P2,0Xf7);//点亮一个LED灯,代表握手成功   
    DelayNs(1);
   
    UART_Clear_BUFF();//
   
    //第二步   检查SIM卡是否存在
    UART_PutStr(0,"AT+CPIN?\r\n\r\n");
    DelayNs(1);
    while(strstr((char const*)USART1BUFF,"OK")==NULL)
    {
        UART_Clear_BUFF();        
        //注意:此处必须为\R\N\R\N!!!
        UART_PutStr(0,"AT+CPIN?\r\n\r\n");
        led(2);  
        //DelayNs(1);      
    }
    GPIO_OUT(P2,0Xfe);
    DelayNs(1);
    UART_Clear_BUFF();//
   
   
    //第三步   设置短信格式为GSM方式
    UART_PutStr(0,"AT+CSCS=\"GSM\"\r\n\r\n");
    DelayNs(1);
    while(strstr((char const*)USART1BUFF,"OK")==NULL)
    {
        UART_Clear_BUFF();        
        //注意:此处必须为\R\N\R\N!!!
        UART_PutStr(0,"AT+CSCS=\"GSM\"\r\n\r\n");
        led(3);
    }
    GPIO_OUT(P2,0Xfb);
    DelayNs(1);
    UART_Clear_BUFF();//
   
    //第四步   设置短信各式为 文本方式
    UART_PutStr(0,"AT+CMGF=1\r\n\r\n");
    DelayNs(1);
    while(strstr((char const*)USART1BUFF,"OK")==NULL)
    {
        UART_Clear_BUFF();        
        //注意:此处必须为\R\N\R\N!!!
        UART_PutStr(0,"AT+CMGF=1\r\n\r\n");
        led(4);        
    }
    GPIO_OUT(P2,0Xf7);
    DelayNs(1);
    UART_Clear_BUFF();//
   
}

/*******************************************************************************
*SIM900发送短信程序
*
*返回值:无
*测试通过时间:2015年1月22日22:58:54
*******************************************************************************/
void SIM900_Send_MSG()
{
    DelayNs(3);
   
    UART_PutStr(0,"AT+CMGS=\"10086\"\r\n\r\n");
    DelayNs(1);
    GPIO_OUT(P2,0Xef);
    DelayNs(3);
   
    UART_PutStr(0,"Hello World!");
   
    GPIO_OUT(P2,0Xbf);   
    DelayNs(3);
    UART_Clear_BUFF();//
   
    UART_PutChar(0,0X1A);//发送短信
   
    GPIO_OUT(P2,0X3c);  //正在发送短信!!!!!  
   
    DelayNs(3);//等待发送结束
   
    while(strstr((char const*)USART1BUFF,"CMGS")==NULL)
    {
        //UART_Clear_BUFF();        
        UART_PutChar(0,0X1A);
        GPIO_OUT(P2,0X7f);
        DelayNs(1);
        GPIO_OUT(P2,0Xff);
        DelayNs(1);  
        GPIO_OUT(P2,0X7f);
        DelayNs(1);  
    }
}


使用特权

评论回复
23
512826028|  楼主 | 2015-1-25 23:05 | 只看该作者
额 不知道是自己分数问题,还是怎么回事,自己发帖可以选择50分,而结贴时又显示错误。

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

4.jpg (25.26 KB )

4.jpg

使用特权

评论回复
24
acer4736| | 2015-1-26 07:47 | 只看该作者
进来学习了 呵呵

使用特权

评论回复
25
jinpaidianzi| | 2015-1-26 07:55 | 只看该作者
向各位大神学习

使用特权

评论回复
26
teabottle| | 2015-1-26 07:57 | 只看该作者
学习了 没想到还有这么棘手的问题

使用特权

评论回复
27
wangjinlili| | 2015-1-26 08:04 | 只看该作者
各位都是高手啊  向你们学习

使用特权

评论回复
28
meishizhaoshi| | 2015-1-26 08:06 | 只看该作者
很值得大家一起来探讨的一个问题

使用特权

评论回复
29
henryetchou| | 2015-1-26 09:44 | 只看该作者
512826028 发表于 2015-1-25 22:44
额 现在这个乱码的原因找到了。

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

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

使用特权

评论回复
30
512826028|  楼主 | 2015-1-26 18:51 | 只看该作者
henryetchou 发表于 2015-1-26 09:44
呵~恭喜您糾錯成功,做一個編程員最大的樂趣,不是順順利利沒卡關的把項目完成,而是遇到數個卡關挫敗, ...

恩  很认同您说的。后面还要慢慢来,还有GPRS定位在等着我。

使用特权

评论回复
31
rfvdfg| | 2015-1-30 10:28 | 只看该作者
都是大神!~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则