织梦CMS - 轻松建站从此开始!

罗索

当前位置: 主页>老古董>『SMS』>

单片机控制GSM模块TC35的方法

jackyhwei 发布于 2010-01-26 11:53 点击:次 
介绍一种采用GSM的短信功能,可以使某些控制达到“零距离”。由于短信息的费用低廉,可以取代传统的无线遥控。现在详细介绍一种采用单片机(MCS51系列)控制TC35(廉价的GSM模块)发送、接收GSM短信的方法。
TAG:

介绍一种采用GSM的短信功能,可以使某些控制达到“零距离”。由于短信息的费用低廉,可以取代传统的无线遥控。现在详细介绍一种采用单片机(MCS51系列)控制TC35(廉价的GSM模块)发送、接收GSM短信的方法。

一、TC35的控制简介

TC35是Siemeils公司推出的新-代无线通信GSM模块。自带RS232通讯接口,可以方便地与PC机、单片机连机通讯。可以快速、安全、可靠地实现系统方案中的数据、语音传输、短消息服务(Short Message Service)和传真。TC35模块的工作电压为3.3—5.5V,可以工作在900MHz和1800MHz两个频段,所在频段功耗分别为2w(900M)和1w(1800M)。

模块有AT命令集接口,支持文本和PDU模式的短消息、第三组的二类传真、以及2.4k,4.8k,9.6k的非透明模式。此外,该模块还具有电话簿功 能、多方通话,漫游检测功能,常用工作模式有省电模式、IDLE、TALK等模式。通过独特的40引脚的ZIF连接器,实现电源连接、指令、数据、语音信号、及控制信号的双向传输。通过ZIF连接器及50Ω天线连接器,可分别连接SIM卡支架和天线。

TC35模块主要由GSM基带处理器、GSM射频模块、供电模块(ASIC)、闪存、ZIF连接器、天线接口六部分组成。作为TC35的核心,基带处理器 主要处理GSM终端内的语音、数据信号,并涵盖了蜂窝射频设备中的所有的模拟和数字功能。在不需要额外硬件电路的前提下,可支持FR、HR和EFR语音信 道编码。其它功能介绍可参见有关资料!

二、AT指令的介绍

TC35模块的通讯全部采用AT+xxx完成。基本的AT指令见:http://www.rosoo.net/a/DevSpecial/SMS/201001/8395.html

三、TC35的连机方法

任何一个TC35模块首次使用时,必须要测试其工作是否正常,由于其自带RS232接口,所以我们可以用PC机的串口调试软件进行调试。

1、启动串口调试软件(见界面)

 


串口调试软件有许多,可以使用任意一款软件,也可以使用WINDOWS自带的“超级终端”。设置波特率19.2k,这是TC35的默认波特率,首次连机可以从2400~57.6k不断测试,直到TC35有应答。

2、发送“AT”

AT 回车

3、改变波特率“AT+IPS=XXXX"

TC35的默认波特率是19.2k,实际使用时,可以改成9600或38.4K,方法如下:

AT+IPR=9600 回车

4、短信模式的设置

(GSM模块的短信模式有2种。第1种是:TEXT模式;第2种是:PDU模式。PDU模式可以采用unicode编码发送英文、汉字。但合成PDU码比较复杂,而TEXT模式只能发送英文,但无须编码。实际使用可以采用TEXT模式。

设置如下:

AT+CMFG=1 回车

5、短信模式简介

SMS是由Etsi所制定的一个规范(GSM 03.40和GSM 03.38)。当使用7-bits编码的时候它可以发送最多160个字符;8-bit编码(最多140个字符)。通常无法直接通过手机显示;通常被用来作为数据消息,例如:smart messaging中的图片和铃声和OTA WAP设置。16-bit信息(最多70个字符)被用来显示Unicode(UCS2)文本信息,可以被大多数的手机所显示。一个以class 0开头的16-bit的文本信息将在某些手机上作为Flash SMS显示(闪烁的SMS和警告SMS)。

有两种方式来发送和接收SMS信息:使用文本模式或者使用PDU(protocol description unit)模式。文本模式(可能某些手机不支持)实际上也是一种PDU编码的一种表现形式。在显示SMS信息,可能使用不同的字符集和不同的编码方式。

6、短信读取方法

AT+CMGR=X回车

如果有短信息,TC35回应:

AT+CMGR=1
+CMGR:"REC UNREAD","13307496548",,"04/08/17,22:24:32+02
testOK
OK

短信息分析:

“test OK"就是短信息内容。
短信息的存储容量与Ic卡有关,序号从1-N。
REC UNREAD":代表短信息未读过。
REC READ" :已读过。
13307496548":接收的手机号码。
04/08/17,22:24:32+02":短信息发送的时间。

无短信息,TC35回应:

AT+CMGR=3
+CMGR:0,,0
 
7、短信的删除方法

AT+CMGD=1回车

8、短信的发送方法

短信息的发送分成两步:

1:发送接收的手机号码,等待应答:“>"
AT+CMGS="13307496548"回车(目的地址)
TC35回应:
AT+CMGS="13307496548" >

2:输入短信息的内容(只能是英文):Test 回车

四、单片机控制TC35的方法

上面介绍了用PC机控制TC35的方法,我们只需将PC机输出的控制命令转化成单片机输出的指令即可。

1、硬件连接

电路见下图只需设计一个TTL转RS232电平电路,连接到MCU的UART口,另一端直接连接到TC35。

 


2、指令输出的方法

单片机串口设置成模式1(9600,N,8,1),依次将AT+xxx以ASCII码形式输出到UART口;接收TC35的数据采用中断方式。这里给出详细的程序清单(Keil C51),不介绍编程的方法。程序见下:

  1. //AT指令的定义  
  2. char code AT_Tc35[]="AT+"//连机  
  3. char code Bps_Tc35[]="IPR=38400"//波特率  
  4. char code Text_Tc35[]="CMGF=1"//文本模式  
  5. char code Read_Tc35[]="CMGR="//读信息  
  6. char code Erase_Tc35[]="CMGD="//删除信息  
  7. char code Send_Tc35[]="CMGS="//发送信息  
  8. char code Creg_Tc35[]="CREG?"//注册  
  9.  
  10. //模式设置  
  11. void UART_Init(void)  
  12. {  
  13. SCON=0x50; //01010000b=>1模式scon,#11011000b;  
  14. ES=l;  
  15. }  
  16.  
  17. //发送-个ASCII  
  18. void SendASC(unsigned char ASC)  
  19. {  
  20. bit es;  
  21. es=ES;  
  22. ES=0;//关闭中断  
  23. TI=0;  
  24. SBUF=ASC;  
  25. while(!TI);  
  26. TI=0;  
  27. ES=es;  
  28. )  
  29.  
  30. //发送命令到TC35  
  31. void SendToTc35(unsigned char* p,unsigned char Long)  
  32. {  
  33. while(Long--)  
  34. {  
  35. SendASC(*p++);  
  36. }  
  37. }  
  38.  
  39. // 通讯中断接收程序  
  40. void Rs485_Do(void) interrupt 4 using 1  
  41. {  
  42. if(RI==l)  
  43. {  
  44. RI=0;  
  45. RsBuq[RsPoint++]=SBUF;  
  46. if fRsPoint>=sizeof(RsBuf))  
  47. {  
  48. RsPoint=0;//FlagRs485=0;  
  49. //数据处理  
  50. }  
  51. }  
  52.  
  53. // 发送AT连机命令  
  54. char code AT_Code[]="OK";  
  55. void Send_AT(void)  
  56. {  
  57. unsigned char *p;  
  58. while(1)  
  59. {  
  60. ClrRsBuf(RsBuf,sizeof(RsBuf));  
  61. SendToTc35(AT_Tc35,2);    //"AT"  
  62. SendASC(OVER);  
  63. //************等待应答“ok"  
  64. ES=1; //必须中断  
  65. Delay(50);  
  66. P=strstr(RsBuf,AT_Code);  
  67. if(p!=NULL) break;  
  68. }  
  69. )  
  70.  
  71. //发送bps连机命令  
  72. void Send_BPS(void)  
  73. {  
  74. SendToTc35(AT_Tc35,3); //"AT+"  
  75. SendToTc35(Bps_Tc35,sizeof(Bps_Tc35)-1);//"IPR=19200"  
  76. SendASC(OVER);  
  77. }  
  78.  
  79. //设置文本  
  80. void SetText(void)  
  81. {  
  82. SendToTc35(AT_Tc35,3);    //"AT+"  
  83. SendToTc35(Text_tc35,sizeof(Text_tc35)-1);//"IPR=19200"  
  84. SendASC(OVER);  
  85. Delay(100);  
  86. }  
  87.  
  88. //删除短信息  
  89. unsigned char EraseMsg(unsigned char index)  
  90. {  
  91. unsigned char *p,i=20;  
  92. SendToTc35(AT_Tc35,3); //"AT+"  
  93. SendToTc35(Erase_Tc35,sizeof(Erase_Tc35)-1);//"IPR=19200"  
  94. SendASC(index);  
  95. SendASC(OVER);  
  96. ES=1;  
  97. while(i--)  
  98. {  
  99. Delay(200);  
  100. P=strstr(RsBuf,AT_Code);  
  101. if(P!=NULL) {return 1;}  
  102. }  
  103.    
  104. return 0;  
  105. }  
  106.  
  107. //读取短信息  
  108. char code Ask_No[]="+CMGR:0,,0";  
  109. char code ERROR{]="ERROR";  
  110. char code Ask_Tc35[]="/";  
  111. unsigned char ReadMsg(unsigned char index)  
  112. {  
  113. unsigned char *p,i;  
  114. unsigned char Buf[40];  
  115.    
  116. SendToTc35(AT_Tc35,3); //"AT+"  
  117. SendToTc35(Read_Tc35,sizeof(Read_Tc35)-1);  
  118. SendASC(index);  
  119. SendASC(OVER);  
  120. ES=1; //必须中断  
  121. Delay(600);  
  122. /*-------  
  123. ES=0:  
  124. SendToTc35(RsBuf,99);  
  125. ES=1;  
  126. */  
  127.    
  128. p=strstr(RsBuf,ERROR);  
  129. if(P!=NULL)  
  130. {  
  131. Send_AT();return 0;  
  132. p=strstr(RsBuf,Ask_No);//无信息  
  133. if(p!=NULL)return 0;  
  134. p=strstr(RsBuf,Ask_Tc35);//20个字节后是MSG  
  135. if(p==NULL) return 0;  
  136. p=p+21;  
  137. for(i=0;i<sizeof(Buf);i++)  
  138. {  
  139. Buf[i]=*p++;  
  140. }  
  141.    
  142. if(EraseMsg(index)==0) return 0;  
  143. p=strcpy(RsBuf,Buf); //放回RsBuf  
  144. return 1;  
  145. }  
  146. }  
  147.  
  148. //发送短信息  
  149. char code SK[]=">";  
  150. void SendMsgStart(void)  
  151. {  
  152. unsigned char *p,i=10;  
  153. SendToTc35(AT_Tc35,3); //"AT+"  
  154. SendToTc35(Send_Tc35,sizeof(Send_Tc35)-1);//"IPR=19200"  
  155. SendASC(YinHao);  
  156. SendToTc35(Mp1.Hand,sizeof(Mp1.Hand)); //"AT+"  
  157. SendASC(YinHao);  
  158. SendASC(OVER);  
  159. ES=1;  
  160. while(i--)  
  161. {  
  162. Delay(100); //Get">"  
  163. p=strstr(RsBuf,SK);//">"  
  164. if(p!=NULL)  
  165. {  
  166. ClrRsBuf(RsBuf,sizeof(RsBuf));  
  167. Delay(150); //Get">"  
  168. break;  
  169. }  
  170. }  
  171. }  
  172.  

 

(秩名)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201001/8394.html]
本文出处:网络博客 作者:秩名
顶一下
(9)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容