SIM900A GPRS调试笔记

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_24478297/article/details/47084987

/************************* ********GPRS调试笔记********************************

调试目的:通过SPCE061A单片机控制SIM900A GPRS模块发送短信

调试过程:

         1.利用延时来发送PDU格式的短信(不接受GPRS的返回值)

         a.发送AT+CMGF=0\r\n指令

         b.延时2s,确定GPRS对a步骤中发送的指令已经接受。ps:延时的时长可做适当调整,但是一定要保证在这段时间里,GPRS已经接受AT

           指令,并作出回应,否则会导致发送短信失败。笔者亲测过,延时时间太短的话,真的无法发送短信,当时没有注意到这一点,调试

           了好久,才发现这个问题。

         c.发送AT+CMGS=21\r\n指令,21为你要发送的字符长度,这里我就不介绍,SIM900A说明书上讲的很详细

         d.延时2s,这里的原理和b中所说的几乎一样,不再追述

         e.发送pdu格式的编码,这里需要设置一些参数,比如短信中心号码,接受号码等等,这里我也不细述了,毕竟使用说明书上写得很清

            楚了,我发送的是“0891683108701305F011000D86688193909435F70008A7064F60597DFF01”,引号内以字符的形式发送就行,

            这一串字符里,包含了一些参数的设置,还有发送短信的内容,读者在实际操作时,可将参数的设置和内容分开发送,笔者为了

            简单处理,就统一处理了。

         f.最后一步了,发送结束符--0x1a,直接发送0x1a,主要这里不要发送成字符了,是16进制0x1a;到此为至,短信已经成功发送了,

         短信的内容是“你好!”;

 

 

 

         2.通过判断GPRS的返回值来发送短信

         a.发送AT+CMGF=0\r\n指令

         b.

         这里是重点,记得当时卡这里卡了好长时间,几乎到了要放弃的边缘!!!这里重点分析一下吧    

         while(strcmp(rec_string1,"AT+CMGF=0\r\n\r\nOK")!=0)

         {       

                   *P_Watchdog_Clear= 0x0001;

         }

         等待接受返回值,并且利用字符串比较函数比较接受到的字符串rec_string1和正确的返回值AT+CMGF=0\r\n\r\nOK对比;

         这里用到的IRQ7串口中断来接受,利用全局变量str_string1[30]和全局n模拟一个栈来缓存接收到的返回值。需要强调说明的是

         ,发送完AT+CMGF=0\r\n这条指令后gprs的返回值应该是“AT+CMGF=0\r\n\r\nOK”,也就是返回了发送过去的AT指令加上回车换行

         加上OK,但是资料上说的却是"OK",简直差点把笔者坑死,经过笔者不懈地努力调试,终于发现了这里的问题。

        

         c.能到这一步,说明之前的返回值已经收到了,但是细心的读者可能就会发现,发送“AT+CMGS=21\r\n”这条指令的前面有这两行

           简单的代码         delay();n = 0; 一行是延时,一行是清空栈底,清空栈底这里我就不过多的解释了,很简单。有的读者会问,

         delay()函数是干什么的呢?不是不利用延时来发送短息吗?这里问题有点复杂,笔者自己也没弄得很清楚,但是当去掉delay()

         或将delay()和n=0;两行代码互换位置后,程序就会死卡,并且,你调试时就会发现n并不是等于0的,rec_string1字符串里面存的

         并不是GPRS本次返回值,而是有一部分是上次的,也就是说n=0这句并没有起到清空栈底的作用,但是,这程序已经运行到

         send_string(cmd2);

         while(strcmp(rec_string1,"AT+CMGS=21\r\n\r\n>")!=0)

         {       

                   *P_Watchdog_Clear= 0x0001;

         }这里了啊?当时笔者也很疑惑,不能理解,感觉完全颠覆了我的认知(曾一度怀疑是61板的问题),但是后来仔细思考了一番

         ,发现很有可能是IRQ7中断的原因,导致n=0,这句执行失败,n=0这句c语言代码经编译器转换成汇编代码后,有好几句,也就是说

         n=0这句C代码并不是cpu执行指令时的最小原子值,因此在执行这句代码时,很有可能被IRQ7中断给打断,导致这种结果。于是,

         笔者在清空栈底时,用了delay()函数,延时确保不会发生中断,保护n=0这行代码。结果证明,我的猜想是正确的。

         d.剩下的就没有什么要注意的了,和方法1里面几乎一样,笔者就不啰嗦了。

         如有错误,希望各位大神能及时指出,互相学习!

这里附上源代码一份,希望对你有帮助!

http://download.csdn.net/detail/qq_24478297/8936803



展开阅读全文

没有更多推荐了,返回首页