Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15496695
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类:

2009-10-18 15:22:47

  介绍一种 采用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指令见:

三、  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),不介绍编程的方法。程序见下:

//AT指令的定义
char code AT_Tc35[]="AT+";    //连机
char code Bps_Tc35[]="IPR=38400";  //波特率
char code Text_Tc35[]="CMGF=1";    //文本模式
char code Read_Tc35[]="CMGR=";  //读信息
char code Erase_Tc35[]="CMGD=";  //删除信息
char code Send_Tc35[]="CMGS=";  //发送信息
char code Creg_Tc35[]="CREG?";    //注册

//模式设置
void UART_Init(void)
{
SCON=0x50;    //01010000b=>1模式scon,#11011000b;
ES=l;
}

//发送-个ASCII
void SendASC(unsigned char ASC)
{
bit es;
es=ES;
ES=0;//关闭中断
TI=0;
SBUF=ASC;
while(!TI);
TI=0;
ES=es;
)

//发送命令到TC35
void SendToTc35(unsigned char* p,unsigned char Long)
{
while(Long--)
{
    SendASC(*p++);
  }
}

//  通讯中断接收程序
void Rs485_Do(void) interrupt 4 using 1
  {
  if(RI==l)
  {
    RI=0;
    RsBuq[RsPoint++]=SBUF;
    if fRsPoint>=sizeof(RsBuf))
    {
    RsPoint=0;//FlagRs485=0;
    }  //数据处理
  }
 }

// 发送AT连机命令
char code AT_Code[]="OK";
void Send_AT(void)
{
unsigned char *p;
while(1)
{
    ClrRsBuf(RsBuf,sizeof(RsBuf));
    SendToTc35(AT_Tc35,2);    //"AT"
    SendASC(OVER);
//************等待应答“ok"
    ES=1;    //必须中断
    Delay(50);
    P=strstr(RsBuf,AT_Code);
    if(p!=NULL) break;
}
)

//发送bps连机命令
void Send_BPS(void)
{
 SendToTc35(AT_Tc35,3);    //"AT+"
 SendToTc35(Bps_Tc35,sizeof(Bps_Tc35)-1);//"IPR=19200"
 SendASC(OVER);
}

//设置文本
void SetText(void)
{
SendToTc35(AT_Tc35,3);    //"AT+"
SendToTc35(Text_tc35,sizeof(Text_tc35)-1);//"IPR=19200"
SendASC(OVER);
Delay(100):

//删除短信息
unsigned char EraseMsg(unsigned char index)
{
 unsigned char *p,i=20;
 SendToTc35(AT_Tc35,3);    //"AT+"
 SendToTc35(Erase_Tc35,sizeof(Erase_Tc35)-1);//"IPR=19200"
 SendASC(index);
 SendASC(OVER);
 ES=1;
 while(i--)
{
    Delay(200);
    P=strstr(RsBuf,AT_Code);
    if(P!=NULL)    {return 1;}
}
return 0;
}

//读取短信息
char code Ask_No[]="+CMGR:0,,0";
char code ERROR{]="ERROR";
char code Ask_Tc35[]="/";
unsigned char ReadMsg(unsigned char index)
{
unsigned char *p,i;
unsigned char Buf[40];
SendToTc35(AT_Tc35,3);    //"AT+"
SendToTc35(Read_Tc35,sizeof(Read_Tc35)-1);
SendASC(index);
SendASC(OVER);
ES=1;    //必须中断
Delay(600);
/*-------
    ES=0:
    SendToTc35(RsBuf,99);
    ES=1;
*/|

p=strstr(RsBuf,ERROR);
if(P!=NULL)
{
    Send_AT();return 0;
p=strstr(RsBuf,Ask_No);//无信息
if(p!=NULL)return 0;
p=strstr(RsBuf,Ask_Tc35);//20个字节后是MSG
if(p==NULL) return 0;
p=p+21;
for(i=0;i{
  Buf[i]=*p++;
}

if(EraseMsg(index)==0) return 0;
p=strcpy(RsBuf,Buf);  //放回RsBuf
 return 1;
)

//发送短信息
char code SK[]=">";
void SendMsgStart(void)
{
unsigned char *p,i=10;
SendToTc35(AT_Tc35,3);    //"AT+"
SendToTc35(Send_Tc35,sizeof(Send_Tc35)-1);//"IPR=19200"
SendASC(YinHao);
SendToTc35(Mp1.Hand,sizeof(Mp1.Hand));    //"AT+"
SendASC(YinHao);
SendASC(OVER);
ES=1;
while(i--)
{
  Delay(100);  //Get">"
  p=strstr(RsBuf,SK);//">"
  if(p!=NULL)
  {
    ClrRsBuf(RsBuf,sizeof(RsBuf));
    Delay(150);  //Get">"
    break;
}
}
}

阅读(3505) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~