SIM900A GPRS调试笔记
扫描二维码
随时随地手机看文章
/************************* ********GPRS调试笔记********************************
调试目的:通过SPCE061A单片机控制SIM900A GPRS模块发送短信
调试过程:
1.利用延时来发送PDU格式的短信(不接受GPRS的返回值)
a.发送AT+CMGF=0rn指令
b.延时2s,确定GPRS对a步骤中发送的指令已经接受。ps:延时的时长可做适当调整,但是一定要保证在这段时间里,GPRS已经接受AT
指令,并作出回应,否则会导致发送短信失败。笔者亲测过,延时时间太短的话,真的无法发送短信,当时没有注意到这一点,调试
了好久,才发现这个问题。
c.发送AT+CMGS=21rn指令,21为你要发送的字符长度,这里我就不介绍,SIM900A说明书上讲的很详细
d.延时2s,这里的原理和b中所说的几乎一样,不再追述
e.发送pdu格式的编码,这里需要设置一些参数,比如短信中心号码,接受号码等等,这里我也不细述了,毕竟使用说明书上写得很清
楚了,我发送的是“0891683108701305F011000D86688193909435F70008A7064F60597DFF01”,引号内以字符的形式发送就行,
这一串字符里,包含了一些参数的设置,还有发送短信的内容,读者在实际操作时,可将参数的设置和内容分开发送,笔者为了
简单处理,就统一处理了。
f.最后一步了,发送结束符--0x1a,直接发送0x1a,主要这里不要发送成字符了,是16进制0x1a;到此为至,短信已经成功发送了,
短信的内容是“你好!”;
2.通过判断GPRS的返回值来发送短信
a.发送AT+CMGF=0rn指令
b.
这里是重点,记得当时卡这里卡了好长时间,几乎到了要放弃的边缘!!!这里重点分析一下吧
while(strcmp(rec_string1,"AT+CMGF=0rnrnOK")!=0)
{
*P_Watchdog_Clear= 0x0001;
}
等待接受返回值,并且利用字符串比较函数比较接受到的字符串rec_string1和正确的返回值AT+CMGF=0rnrnOK对比;
这里用到的IRQ7串口中断来接受,利用全局变量str_string1[30]和全局n模拟一个栈来缓存接收到的返回值。需要强调说明的是
,发送完AT+CMGF=0rn这条指令后gprs的返回值应该是“AT+CMGF=0rnrnOK”,也就是返回了发送过去的AT指令加上回车换行
加上OK,但是资料上说的却是"OK",简直差点把笔者坑死,经过笔者不懈地努力调试,终于发现了这里的问题。
c.能到这一步,说明之前的返回值已经收到了,但是细心的读者可能就会发现,发送“AT+CMGS=21rn”这条指令的前面有这两行
简单的代码 delay();n = 0; 一行是延时,一行是清空栈底,清空栈底这里我就不过多的解释了,很简单。有的读者会问,
delay()函数是干什么的呢?不是不利用延时来发送短息吗?这里问题有点复杂,笔者自己也没弄得很清楚,但是当去掉delay()
或将delay()和n=0;两行代码互换位置后,程序就会死卡,并且,你调试时就会发现n并不是等于0的,rec_string1字符串里面存的
并不是GPRS本次返回值,而是有一部分是上次的,也就是说n=0这句并没有起到清空栈底的作用,但是,这程序已经运行到
send_string(cmd2);
while(strcmp(rec_string1,"AT+CMGS=21rnrn>")!=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