|
笔者文章刊登于2008年10月《无线电》杂志“GSM模块——实现远程控制的新锐 ”一文,文章中我们介绍了一些常用的GSM模块,其中使用最为广泛的是西门子的TC35或TC35i模块,因此,我们在2008年推出了“西门子 Siemens TC35/TC35i GSM 开发板”,自投放市场以来,受到了广大用户的好评,品质、质量、做工、资料属于一流,我们成功开发了短信控制继电器的源程序代码,使用C语言平台,使用51单片机来收发短信,方便了很多客户进行二次开发,也有不少客户在我们开发板的平台上快速、高效地完成了二次开发,做了一系列的GSM控制产品。
TC35/TC35i GSM 串口开发板硬件资源与特点介绍: 1、电源设计使用大电流专用电源IC模块29302,保证电源电路稳定供电。现在市场上的一些廉价开发板我们看到很多是直接使用LM7805,因为5V的输出电压已经非常接近TC35模块的上限临界点,所以长时间工作,稳定性差,比较比较危险,7805的输出电流最大只能是1.5A,而我们使用的29302最大的输出电流可达3A,要知道GSM通信时,有时瞬间的电流是非常大的,特别是在一些信号不好的地方,为了搜索网络信号,模块会提升自己的发射功率,这时的电流消耗是非常大的了,电源电路做得不好,稳定性的话,就会体现出问题了。我们曾对市场上一些开发板进行过抽样测试,事实发现有很多板子在一些信号差的情况下,都不能正常通信与工作,我们测试时做了相应的屏蔽控制。 1、使用波峰焊工艺,焊点漂亮,做工精致。 套装清单:——售价:228元/套 (西门子 Siemens TC35/TC35i GSM 串口开发板) Siemens TC35/TC35i GSM 串口开发板:1块 (板上带有Siemens 西门子TC35模块,如需将标配更换成TC35i,需要补差价,请先电话和我们联系) AT指令集;SIEMENS_TC3x接口描述;Siemens TC35i数据手册 注意:该开发板可适用于TC35/TC35i/MC35/MC35i 模块,我们下面的介绍以TC35模块为例。
这是我们在2008年10期《无线电》杂志上刊登的TC35模块介绍文章,大家也可以直接翻阅《无线电》杂志。 这是我们的“西门子 Siemens TC35/TC35i GSM 开发板”的操作演示视频录像,大家可以点击下载视频文件进行观看,视频中我们介绍了学习板的硬件和软件资料的情况以及初次使用的应用实例,大家可以做个参考,很多原理都是一样的。注意,为了达到最好的显示效果,请全屏播放进行观看 -->>下载高品质视频文件 http://www.hificat.com/tc35/tc35.rar
该板方便用户实验、开发,根据用户的设计思维自由组合很快将思想变为产品,无论用户有无GSM方面的知识累积,该板都是良好助手。 实验说明: ◆ 短信收发实验。 ◆ 话音呼叫实验。 ◆ AT指令实验。
这是模块DEMO测试程序,我们可以用来读取模块预存的各种出厂信息,以及发送中文短信的实例应用。 直接点击图片放大观看。 这是模块DEMO测试程序,我们可以用来读取模块预存的各种出厂信息,以及发送英文短信的实例应用。 直接点击图片放大观看。
下面我们来看一下miniTC35开发板的一些硬件资源特写:
------------------------------------------------------------------------------------------------------------------------------- 西门子 TC35i模块介绍 TC35i新版西门子工业GSM模块是一个支持中文短信息的工业级GSM模块,工作在EGSM900和GSM1800双频段,电源范围为直流3.3~4.8V ,电流消耗——休眠状态为3.5mA,空闲状态为25mA,发射状态为300mA(平均),2.5A峰值;可传输语音和数据信号, 功耗在EGSM900(4类)和GSM1800(1类)分别为2W和1W ,通过接口连接器和天线连接器分别连接SIM卡读卡器和天线。SIM电压为3V/1.8V,TC35i的数据接口(CMOS电平)通过AT命令可双向传输指令和数据,可选波特率为300b/s~115kb/s , 自动波特率为1.2kb/s~115kb/s。它支持Text和PDU格式的SMS(Short Message Service,短消息),可通过AT命令或关断信号实现重启和故障恢复,中文资料如下: TC35i由供电模块(ASIC)、闪存、ZIF连接器、天线接口等6部分组成。作为TC35i的核心基带处理器主要处理GSM终端内的语音和数据信号,并涵盖了蜂窝射频设备中的所有模拟和数字功能。 TC35i硬件设计: TC35i模块有40个引脚,通过一个ZIF(Zero Insertion Force,零阻力插座)连接器引出。这40个引脚可以划分为5类,即电源、数据输入/输出、SIM卡、音频接口和控制。 TC35i的第1~5引脚是正电源输入脚通常推荐值4.2V,第6~10引脚是电源地。11、12为充电引脚,可以外接锂电池,13为对外输出电压(共外电路使用),14为ACCU-TEMP接负温度系数的热敏电阻,用于锂电池充电保护控制。 15脚是启动脚IGT,系统加电后为使TC35i进入工作状态,必须给IGT加一个大于100ms的低脉冲,电平下降持续时间不可超过1ms。 16~23为数据输入/输出,分别为DSR0、RING0、RxD0、TxD0、CTS0、RTS0、DTR0 和DCD0。tc35i模块的数据输入/输出接口实际上是一个串行异步收发器,符合ITU-T RS232接口标准。它有固定的参数:8位数据位和1位停止位,无校验位,波特率在300bps~115kbps之间可选,默认9600。硬件握手信号用RTS0/CTS0,软件流量控制用XON/XOFF,CMOS电平,支持标准的AT命令集。 其中18脚RXD、19脚TXD为TTL的串口通讯脚,需要和单片机或者PC通讯。 TC35i使用外接式SIM卡, 24~29为SIM卡引脚,SIM卡同TC35i是这样连接的:SIM上的CCRST、CCIO、CCCL、CCVCC和CCGND通过SIM卡阅读器与TC35i的同名端直接相连,ZIF连接座的CCIN引脚用来检测SIM卡是否插好,如果连接正确,则CCIN引脚输出高电平,否则为低电平。 TC35i的第32脚SYNC引脚有两种工作模式,一种是指示发射状态时的功率增长情况,另一种是指示TC35i的工作状态,可用AT命令AT+SYNC进行切换,本模块使用的是后一种。当LED熄灭时,表明TC35i处于关闭或睡眠状态;当LED为600 ms亮/600ms熄时,表明SIM卡没有插入或TC35i正在进行网络登录;当LED为75 ms亮/3s熄时,表明TC35i已登录进网络,处于待机状态。 30、31、32脚为控制脚,其中30为RTC backup,31为Power down,32 为SYNC。 35~38为语音接口,35、36接扬声器放音。37、38可以直接接驻极体话筒来采集声音(37是话筒正端,39是话筒负端) TC35I开发技巧: 模块的供电电压如果低于3.3V会自动关机。同时模块在在发射时,电流峰值可高达2A。同时在此电流峰值时,电源电压(送入模块的电压)下降值不能超过0.4V。所以该模块对电源的要求较高,电源的内阻+FFC联接线的电阻必需小于200mΩ。 单片机通过两根I/O口控制TC35的开关机、复位等,通过串口与TC35进行数据通信,通信速率为9600Kbps,采用8位异步通讯方式,1位起始位,8位数据位,1位停止位。 TC35模块输入输出的TTL正电平逻辑不是+5V,而是+2.9V,因此必要时加端口保护。 新版德国西门子工业级GSM模块TC35i套装 ,清单如下: 1、TC35i模块一个 TC35i模块的详细英文PDF资料 >>下载
40芯0.5mm间距扁平排线3厘米长 5元一个
TC35I专用天线转接线 10元一根 村田头转成SMA接口,主要用于TC35I模块和GSM天线的连接。是每个西门子模块必备的产品. GSM小天线(SMA接口) 10元一个
这是SIM卡座 5元一个
LM2941CS 7元一片 它是开关型可调高性能微波电路专用稳压芯片,上图中最左边的第一脚是电压调整端,提供1.28V的基准电压,可以通过外围两个电阻的分压比能灵活改变输出电压,第二脚是控制端,高电平时关闭电源模块,低电平时模块正常工作,第三脚是地,第四脚是电源输入端,第五脚是电压输出端,例如TC35理想工作电压是4.2V。 很多客户对TC35I不太熟悉,对如何调试无从下手,我们以TC35I试验板为例来简单说一下,首先将内正外负的9v直流电源接通试验板的插座中,测量LM2941CS的第5脚是否输出4.2V的直流电压?如果没有检查2941的第2脚是否接地?然后通过排线连接TC35I,插好手机卡并接好天线转接线和GSM天线,再通电测量TC35I的第1~5脚是否有4.2V电压?将TC35I的第16脚也就是单片机的P1.3脚对地短路一下,这时TC35I就能启动,等1分钟后,用其他电话拨打手机卡号,如果不能接通重点检查排线座和SIM卡的6根线是否有接触不良?如果能接通说明TC35I正常,如果直接用单片机调试是非常困难的,可以将TC35I的串口脱离单片机通过RS232电平转换后连接电脑的串口,先用我们开发的短信息收发专用软件(点击下载) 进行测试,如果能正常工作再用串口调试助手软件(点击下载)进行AT命令测试。最后用单片机调试。
进行串口调试时,可以先发送AT,看看TC35I模块是否能回答AT OK,如果行说明串口部分硬件正常,如果不能回复,请顺着串口的两根PCB走线检查,看看4053的两根飞线是否连接正确?TC35I排线座上的两根串口线是否接触不良?如果TC35I和单片机的供电电压相同,可以去掉220欧姆的保护电阻。 还有AT命令比较复杂,不同生产日期的TC35I模块的AT指令可能有一些区别,请客户以实践为准耐心调试,一个复杂的系统完全指望别人是不可能成功的,请务必保持一定的心理准备。 下面我们列举一些常用的AT指令:
这是用串口调试助手成功发送的中文短信息完整过程,短信中心号码:13800513500 短信接收方号码:13306285091 短信内容:晚上好123 红色表示发送的内容,蓝色表示接收到的数据,黑色表示备注。 AT(回车)通讯握手 OK 表示第45条短信发送成功 下面分析这条信息: 单片机实现短信自动发送 进行短信发送的前提是短信内容的正确编码。经过以上对短信发送过程的分析,可以通过单片机对其进行实现。下面是实现程序例程: /*------------------------------------------------------------------------- 函数名:PDU_SMS() 功能 :发送短信 参数说明:SMS_Center为短信中心号码 11位 SMS_Telenum为短信接收方的号码 11位 SMS_Context为短信的内容 --------------------------------------------------------------------------------*/ int PDU_SMS(char *SMS_Center, char *SMS_Telenum, char *SMS_Context,char is_GB) { int i,j; unsigned char len,time; char lens[3]; time=0; for(i=0;i<300;i++) PDU_Code[i]=PDU_t[i]; /*----------设置短信中心号码--------------*/ for (i = 0, j = 0; i < strlen(SMS_Center) / 2; i++) { PDU_Code[6+(j++)] = SMS_Center[2 *i + 1]; PDU_Code[6+(j++)] = SMS_Center[2 *i]; } PDU_Code[6+j++] = 'F'; //在最后补上的F PDU_Code[6+j] = SMS_Center[strlen(SMS_Center) - 1]; /*---------------------------------------------*/ /*----------设置接收号码--------------*/ for (i = 0, j = 0; i < strlen(SMS_Telenum) / 2; i++) { PDU_Code[26+(j++)] = SMS_Telenum[2 *i + 1]; PDU_Code[26+(j++)] = SMS_Telenum[2 *i]; } PDU_Code[26+j++] = 'F'; PDU_Code[26+j] = SMS_Telenum[strlen(SMS_Telenum) - 1]; /*---------------------------------------------*/ /*----------设置短信内容长度--------------*/ if(is_GB==0) len = strlen(SMS_Context) *2; else len = strlen(SMS_Context); PDU_Code[44] = (len >> 4) > 9 ? (len >> 4) + 55: (len >> 4) + 48; PDU_Code[45] = (len &0x0f) > 9 ? (len &0x0f) + 55: (len &0x0f) + 48; /*---------------------------------------------*/ /*----------编码短信内容--------------*/ if(is_GB==0)//如果不是GB码,短信内容为ascii码字符串 { for (i = 0,j=0; i<strlen(SMS_Context);i++) { szzh16(SMS_Context[j++],lens); PDU_Code[46+i*4] = '0'; PDU_Code[46+i*4+1] = '0'; PDU_Code[46+i*4+2] = lens[0]; PDU_Code[46+i*4+3] = lens[1]; } PDU_Code[46+i*4] = 0x1a; PDU_Code[46+i*4+1] = 0xff; } else //短信内容为GB码,如果要使手机能够显示,改到UNICODE编码 { for (i = 0,j=0; i<strlen(SMS_Context);i++) { szzh16((int)SMS_Context[j++],lens); PDU_Code[46+i*2] = lens[0]; PDU_Code[46+i*2+1] = lens[1]; } PDU_Code[46+i*2] = 0x1a; PDU_Code[46+i*2+1] = 0xff; } /*---------------------------------------------*/ if(PDU_HandShake()) { do { //LCD_PutChn(5,96,"SS..."); //if(is_GB) PDU_EnablePDU(); if(is_GB==0) PDU_SetLength(Strlen(SMS_Context)*2); else PDU_SetLength(Strlen(SMS_Context)); PDU_Send(PDU_Code); //LCD_PutEng(5,96,"SS"); for(i=0;i<25;i++) delay(20000); sbuf[counter]=0; //LCD_PutNum16(5,96,time); counter=0; time++; } //判断是否发送成功,如果不成功继续发送,最多4次,如仍不成功,返回0 while(strpos(sbuf+strlen(sbuf)-20,'G')==-1&&time<4); if(strpos(sbuf+strlen(sbuf)-20,'G')==-1) return 0; else return 1; //成功的话返回0 } else { //LCD_PutEng(5,96,"LL"); sbuf[counter]=0; //LCD_PutEng(0,0,sbuf); counter=0; return 0; } } 以上程序成功实现短信的发送,其中的一些函数限于篇幅可自行实现。 (6)单片机对短信的读取与解码 单片机可以通过AT指令对短信猫中的短信进行读取,并对读入的短信数据进行分析与解码。 读出的短信格式与发送时的短信编码大致是相同的。下面给出相应的程序例程,读者可以在自行实验中对照验证。 1. 读取某一条短信,并将其进行显示 /*------------------------------------------------------- 函数名:LAD_SMS()(short for "Load And Display the Short MessageS") 功能:用户函数,读取第n条短信,并在LCD的(x,y)位置显示出来 ----------------------------------------------------------*/ unsigned char LAD_SMS(unsigned char n,unsigned char x,unsigned char y) { unsigned char i,len,t; char temp[5]; char temp1[3]; //IN_Draw_BlankorBlackRect(0,20,30,72,0); szzh10(n,temp1); //将n转为相应的字符串,如n=21,则字符串为"21",用以与AT指令拼接。 t=85; clear_sbuf(); counter=0; send_s("AT+CMGR=");//AT+CMGR为读取短信的AT指令 send_s(temp1);//上面所得的字符串 send(0x0d); send(0x0a); for(i=0;i<10;i++) delay(10000); //等待读取完毕 sbuf[counter]=0; //在收到的数据末尾附加'\0' temp[0]=sbuf[23]; temp[1]=sbuf[24]; temp[2]=sbuf[25]; temp[3]=0; if(sbuf[25]!=0x0d) t++; for(i=0;i<strlen(temp);i++) if(temp[i]==0x0d) temp[i]=0; len=atoi(temp); //获取收到的短信内容长度 //LCD_PutEng(23,76,"(SM:"); //LCD_PutNum16(27,76,n); //LCD_PutEng(29,76,")"); if(len==0) { //LCD_PutEng(5,96,"EMP"); //LCD_PutChn(x,y,">短信空"); delay(50000); return 0; } len-=20; if(len>90) { //LCD_PutEng(5,96,"MTL"); //LCD_PutChn(x,y,">短信太长"); delay(50000); return 0; } for(i=0;i<len;i++) { temp[0]=sbuf[t+2*i]; temp[1]=sbuf[t+2*i+1]; temp[2]=0; sbuf[i]=_hex_(temp); //收到的短信内容是内存方式的显示表示,转为十六进制数 } sbuf[i]=0; Analysis_Pro();//解码后的内容在sbuf中,此函数对其进行显示输出 //LCD_PutEng(x,y,inf_bw.Date); //LCD_PutEng(x,y,sbuf+29); delay(50000); clear_sbuf(); counter=0; return 1; } 2. 检测新短信 /*------------------------------------------------------- 函数名:Check_New() 功能:用户函数,检测有无新的短信,如果有返回1,否则返回0 ----------------------------------------------------------*/ unsigned char Check_New() {int i; send_s("AT+CMGL=0"); //AT+CMGL=0为读取新短信的AT指令 send(0x0d); send(0x0a); //发送回车 delay(10000); //等待接收完毕 if(sbuf[12]=='O') return 0xff; if(sbuf[12]=='+') { for(i=18;i<23;i++) if(sbuf[i]==',') sbuf[i]=0; return atoi(sbuf+19); //返回新短信的位置 } } 3. 删除某条短信 /*------------------------------------------------------- 函数名:Delete() 功能:用户函数,删除第n条短信 ----------------------------------------------------------*/ unsigned char Delete(unsigned char n) { char t[10]; char t1[5]; strcpy(t,"AT+CMGD="); //AT+CMGD为删除短信的AT指令 szzh10(n,t1); strcpy(t+8,t1); while(Send_AT_CMD(t)!=1); //LCD_PutEng(5,96,"SM"); //LCD_PutNum16(7,96,n); //LCD_PutEng(10,96,"De"); delay(60000); return 1; } TC35的控制主要包含如下几类指令: (1)初始化指令 设置短消息发送格式AT+CMGF=1<CR>,设置1代表PDU模式,<CR>是回车符号,也就是0x0d,指令正确则模块返回<CRLF>OK<CRLF>,<CRLF>是回车换行符号。 (2)设置/读取短消息中心 短消息中心号码由移动运营商提供。 设置短消息中心的指令格式为: AT+CSCA=″+8613800531500″(短消息中心)<CR> 设置正确则模块返回<CRLF>OK<CRLF>。 读取短消息服务中心则使用命令: AT+CSCA=?<CR> TC35模块应该返回: <CRLF>+CSCA:″8613800531500″<CRLF>。 (3)设置短消息到达自动提示 设置短消息到达自动提示的指令格式为: AT+CNMI=1,1,0,0,1<CR> 设置正确则TC35模块返回: <CRLF>OK<CRLF>。 设置此命令可使模块在短消息到达后向串口发送指令: <CRLF>+CMTI:″SM″,INDEX(信息存储位置)<CRLF>。 通过TC35发送短消息的方法为: PC上的控制软件按照PDU的格式发送和接收数据,短消息的内容可以是中文或者其他字符。在PDU模式,如果发送短消息,则首先发送短消息数据的长度: AT+CMGS=<length><CR> 等待TC35模块返回ASCII字符">",则可以将PDU数据输入,PDU数据以<Z>(也就是0x1a)作为结束符。短消息发送成功,模块返回: <CRLF>OK<CRLF> 通过TC35接收短消息的方法为: 短消息到来后,串口上会接收到指令 <CRLF>+CMTI:″SM″,INDEX(信息存储位置)<CRLF> PC上的控制软件通过读取PDU数据的AT命令 AT+CMGR=INDEX<CRLF> 将TC35模块中PDU格式的短消息内容读出。如果用+CMGL代替+CMGR,则可一次性读出全部短消息。 通过TC35删除短消息的方法为: PC上的控制软件收到一条短消息并处理后,需要将其在SIM卡上删除,以防止SIM卡饱和。删除短消息的指令为: AT+CMGD=INDEX<CR> 删除后模块返回 <CRLF>OK<CRLF> 2.程序实例 由于本文的宗旨在于讲解串口通信,因此,我们屏蔽图形用户界面的细节,制作一个简单的短信收发软件,它包含了控制短信终端的所有串口通信内容。实际上,一个理想的短信收发软件的界面应类似于Outlook或Foxmail,包含收件箱、发件箱、已发送短信箱等内容,但是这些东西都与我们要介绍的串口通信无关,因此,下面的软件界面虽"败絮其外",但仍可称得上"金玉其中": 关于界面上控件的描述如下: BEGIN 对话框类的消息映射为: BEGIN_MESSAGE_MAP(CSMSControlDlg, CDialog) 下面是对本例程软件的主要数据结构和核心函数的介绍: 数据结构 // 用户信息编码方式 发送短消息 发送按钮对应的函数为CSMSControlDlg::OnSendButton,它读取用户输出并根据目标电话号码和短信息内容形成SM_PARAM(源PDU参数)的内容,接着进行发送: void CSMSControlDlg::OnSendButton() //填充SM_PARAM结构体内容 //发送短信息 其中调用的gsmSendMessage函数体现了串口通信的核心内容,它按照第1节阐述的GSM模块发送短消息的串口控制流程进行短信的发送: BOOL gsmSendMessage(const SM_PARAM *pSrc // pSrc: 源PDU参数指针) nPduLength = gsmEncodePdu(pSrc, pdu); // 根据PDU参数,编码PDU串 gsmString2Bytes(pdu, &nSmscLength, 2); // 取PDU串中的SMSC信息长度 // 命令中的长度,不包括SMSC信息长度,以数据字节计 WriteComm(cmd, strlen(cmd)); // 先输出命令串 nLength = ReadComm(ans, 128); // 读应答数据 nLength = ReadComm(ans, 128); // 读应答数据 读取短消息 点击"接收"按钮会通过gsmReadMessage函数的调用获得所有短消息,最后在列表控件中显示所有短信: void CSMSControlDlg::OnRecvButton() //显示短信 // 参数:pMsg 短消息缓冲区,必须足够大 nMsg = 0; sprintf(cmd, "AT+CMGL\r"); // 生成命令,用+CMGL可一次性读出全部短消息 gsmDecodePdu(ptr, pMsg); // PDU串解码 删除短消息 我们可以在读取完所有短信息后调用gsmDeleteMessage函数在GSM模块上删除那些已经被接收到PC上的短信息,它按照第1节阐述的GSM模块删除短消息的串口控制流程进行短信的删除: // index: 短消息序号,从1开始 sprintf(cmd, "AT+CMGD=%d\r", index); // 生成命令 // 输出命令串 // 读应答数据 // 根据能否找到"+CMS ERROR"决定成功与否 在PC控制软件的短信列表框中删除所有短消息的"清空"按钮函数为: void CSMSControlDlg::OnDeleteallButton() 设置/读/写串口 在应用程序启动与退出及gsmSendMessage、gsmReadMessage和gsmDeleteMessage函数中广泛使用的串口相关函数用WIN32 API实现: // 串口设备句柄 // 打开串口 hComm = CreateFile(pPort, // 串口名称或设备路径 if (hComm == INVALID_HANDLE_VALUE) GetCommState(hComm, &dcb); // 取DCB SetCommState(hComm, &dcb); // 设置DCB SetCommTimeouts(hComm, &timeouts); // 设置超时 // 关闭串口 // 写串口 // 读串口 陷于本文的篇幅,这里只给出编解码函数的原型,具体请参看GSM标准及《通过串口收发短消息》一文。 // UCS2编码 返回: 目标编码串长度 // UCS2解码 返回: 目标字符串长度 //可打印字符串转换为字节数据 返回: 目标数据长度 // 字节数据转换为可打印字符串 返回: 目标字符串长度 |
专业生产 智能家居控制系统 GSM远程遥控开关 串口继电器控制盒 GPRS MODEM 单片机开发板 电子制作散件套件 我们专注于智能家居控制系统,GPRS数据采集系统,物联网智能控制方向 晶控电子----让我们的生活更美好 品质更卓越 生活更智能 联系地址:浙江省杭州市登云路428号 浙江时代电子市场4楼852室 邮政编码:310011 Email:hificat@163.com 电话总机:0571-88009850 产品咨询:转分机1 技术支持:转分机2 传真:转分机3 手机:13185018567 销售QQ:1198450005 杭州晶控电子有限公司 版权所有 2003-2012 HANGZHOU KinCony ELECTRONICS CO.,LTD 网站备案:浙ICP备11001927号 |