STC单片机控制GSM模块开发总结.docx

上传人:rrsccc 文档编号:9853547 上传时间:2021-03-30 格式:DOCX 页数:6 大小:15.54KB
返回 下载 相关 举报
STC单片机控制GSM模块开发总结.docx_第1页
第1页 / 共6页
STC单片机控制GSM模块开发总结.docx_第2页
第2页 / 共6页
STC单片机控制GSM模块开发总结.docx_第3页
第3页 / 共6页
STC单片机控制GSM模块开发总结.docx_第4页
第4页 / 共6页
亲,该文档总共6页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《STC单片机控制GSM模块开发总结.docx》由会员分享,可在线阅读,更多相关《STC单片机控制GSM模块开发总结.docx(6页珍藏版)》请在三一文库上搜索。

1、STC单片机控制GSM模块开发总结STC单片机控制GSM模块开发总结(一)开机初始化GSM模块的AT指令函数:如检测连接指令ATr,取消回显指令ATE0r,查询网络注册状态指令AT+CREG?r,查询信号强度指令AT+CSQr,设置短信格式指令AT+CMGF=1/0r,查询SIM卡状态指令AT+TSIMINS?r等。最好关闭串口中断,用查询RI 的方法来检测发送AT指令后串口返回的数据是否正确。例如:/*SEND AT*/void at_send() uchar data i=0,err_cnt=0;while(1) TI=0;RI=0;send_char(Command_At,3); /发送

2、ATrfor(i=0;iat_timer=0; /用定时器计时,at_timer每10ms加1,防止串口没有/回复形成死循环while(!RI) if(at_timer100) /延时1s,如果串口没有返回数据,退出循环break;if(at_timer100) /退出for循环break;rec_bufi=SBUF;RI=0;if(rec_buf5=O&rec_buf6=K) break;else if(err_cnt+delay100ms(); /返回的字符串不正确,延时一段时间,重新发送ATrelsedeal_with_error();因为在初始化的时候,没有任务要执行,可以等待串口返回

3、数据。所以上面这种方式检测数据比较方便。但是在程序运行的时候,当有新短信到,需要马上读短信。如果仍然采用上面这种查询RI来读数据的话,在读短信的过程中,有新的短信到,或者有来电,因为串口中断关闭,就有可能检测不到。所以在程序初始化结束后,应该打开串口中断。在串口中断中检测GSM模块返回的数据.例如:/*读SIM卡中存储的电话号码*串口返回的数据:+cpbr:1,137*,129,name*/void at_cpbr(uchar data x) ES=0; /发送数据时关闭串口中断send_char(Command_Cpbr,8);/发送AT+CPBR=send_ascii(0x31+x); /

4、发送SIM卡序号,如1send_ascii(r); /读SIM中序号1中的号码ES=1;在串口中断的接收程序如下:/*串口接收中断程序*/void serial_isr() interrupt 4 using 2ES=0;if(TI)TI=0;if(RI) RI = 0;*(p+)=SBUF;if(*(p-1)=n&*(p-2)=r) /连续接收到rn,把指针P重新指向rec_buf0,这样rec_buf的开始几个字节是:+CLIP,+CMTI,RING,NO /CARRIER,NO ANSWER,NO DIALTONE,OK,ERROR +CPBR几种情况中的一种, 方便程/序判断GSM模块

5、当前的工作情况p=rec_buf;rec_ok=0; /这时把rec_ok清零,表示接收完一行数据if(rec_buf0=+&rec_buf1=C&rec_buf2=L&rec_buf3=I&r ec_buf4=P) /串口收到+CLIPif(rec_ok=0) /有来电if(p-rec_buf)22) /串口接收完来电号码后开始读取来电号码r=ring_phone;s=strchr(rec_buf,);/把返回字符串中指向第一个的地址送给s while(*+s)!=)*(r+)=*s;/把返回字符串中最开始的之间的电话号码放到/ring_phone中,得到来电号码*r=0; /在字符串后面加

6、一个结束符ring_flag=1; /来电标志置1rec_ok=1; /接收完成标志置1,以免在没有新的一行串口数据来之/前不断的执行这段程序elseif(rec_buf0=+&rec_buf1=C&rec_buf2=P&rec_buf3=B&rec_buf 4=R) /收到返回数据+cpbrif(rec_ok=0) if(p-rec_buf)24) r=phone_num;s=strchr(rec_buf,);/把返回字符串中指向第一个的地址送给swhile(*+s)!=)*(r+)=*s;/把返回字符串中最开始的之间的电话号码放到/phone_num中*r=0;/在字符串后面加一个结束符r

7、ec_ok=1;/接收完成标志rec_status=0x01;/对应at+cpbr的返回数据ES=1;发送完读SIM号码命令后,检测rec_status是否等于1,是就表示读号码成功.注意中断程序的红色部分.这是我认为处理串口数据比较好的方法.串口有时返回的数据很多.如果全部接收下来放在一个缓冲区,会占用很多RAM.我现在定义的rec_buf缓冲区有80字节.用这种处理方法完全够用.GSM模块返回的数据都是以rn做为一行的结尾,比如rnOKrn,有些以rn开头.所以在串口中断中连续检测到到rn就表示一行结束.把指针重新定位到rec_buf0.这样从rec_buf0 开始的字符串就是+CLIP,+CPBR,+CMGR,+CMTI,OK,ERROR等,方便了程序判断.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1