加入收藏夹
 公司简介 || 产品列表 || 购买方式 || 汇款订单提交 || 论坛 || Universal Programmer || 淘宝网店 || 诚聘英才 || 单片机项目开发


西门子 Siemens TC35/TC35i GSM 串口开发板

    笔者文章刊登于2008年10月《无线电》杂志“GSM模块——实现远程控制的新锐 ”一文,文章中我们介绍了一些常用的GSM模块,其中使用最为广泛的是西门子的TC35或TC35i模块,因此,我们在2008年推出了“西门子 Siemens TC35/TC35i GSM 开发板”,自投放市场以来,受到了广大用户的好评,品质、质量、做工、资料属于一流,我们成功开发了短信控制继电器的源程序代码,使用C语言平台,使用51单片机来收发短信,方便了很多客户进行二次开发,也有不少客户在我们开发板的平台上快速、高效地完成了二次开发,做了一系列的GSM控制产品。

    2008-2009年,我们根据用户的反馈情况与建议,将硬件与设计的软件做了相应的完善,推出了09新款,修正了之前的一些BUG,PCB硬件的版本号分别有1.0、1.1、1.2、1.3版,目前TC35开发板带继电器的款式最新为1.3版。1.3版到现在为止已有大半年的时间,2010年上半年,我们再次根据用户反馈与市场需求相结合,推出了2010新款 MiniTC35/TC35i开发板;2010年底,我们根据自主研发的“西门子 Siemens TC35/TC35i GSM 开发板”、“MiniTC35/TC35i开发板”的经验总结,推出了最新款TC35串口开发板,即TC35 Modem,在硬件上保留了原来硬件产品稳定性的特点,对硬件资源做了重新调整,以适合不同人群的需要。TC35串口开发板,板上去除了原有的8路继电器,减小的产品体积,降低了生产成本,适合用户直接通过串口进行AT指令的控制,可以做为串口开发板,以以以作为MODEM来使用,给用户提供了更好、更优的产品,希望大家喜欢。

    对于GSM模块的说明:有很多用户经常会咨询我们TC35、TC35I、MC35、MC35I的区别,MC35系列的模块,主要是支持GPRS,MC35I比MC35的速度要快,而TC35和TC35I的区别在于外形,体积,电压都不同,有一些指令也不同,经常我们实际比对测试,TC35I的功耗比TC35要小一些,其它没有太多的区别,当然用户最关心的还是价格的问题,TC35I比TC35要贵不少,如果用户用来做一些短信和语音方面的功能,那完全可以使用TC35模块,我们可以提供稳定的货源,对于MC35和TC35,如果你一定要用到GRPS功能,那只能选择MC35系列模块,MC35I比MC35的速度要快,但价格要高一些。对于使用TC35、TC35I、MC35、MC35I的模块,都可以直接在我们的开发板上使用,管脚都是完全兼容的,我们也经过实测。

tc35开发板
TC35/TC35i GSM 串口开发板实物照片

tc35i开发板
TC35/TC35i GSM 串口开发板插上天线后的实物照片

tc35开发板
新款 西门子 Siemens MiniTC35/TC35i GSM 开发板 2010年最新款式

tc35开发板
这是 西门子 Siemens TC35/TC35i GSM 开发板 V1.2版 ,目前最新已更新到V1.3版

TC35/TC35i GSM 串口开发板硬件资源与特点介绍:

    1、电源设计使用大电流专用电源IC模块29302,保证电源电路稳定供电。现在市场上的一些廉价开发板我们看到很多是直接使用LM7805,因为5V的输出电压已经非常接近TC35模块的上限临界点,所以长时间工作,稳定性差,比较比较危险,7805的输出电流最大只能是1.5A,而我们使用的29302最大的输出电流可达3A,要知道GSM通信时,有时瞬间的电流是非常大的,特别是在一些信号不好的地方,为了搜索网络信号,模块会提升自己的发射功率,这时的电流消耗是非常大的了,电源电路做得不好,稳定性的话,就会体现出问题了。我们曾对市场上一些开发板进行过抽样测试,事实发现有很多板子在一些信号差的情况下,都不能正常通信与工作,我们测试时做了相应的屏蔽控制。

    2、开发板上带有自动启动的硬件电路,使用者不用再去额外的使用单片机的I/O接口。

    3、SIM卡座使用优质自弹式进口卡座,使用方便,直接塞入或弹出即可,手感一流。

    4、1个LED状态指示灯:通过LED发光管实时了解模块当前工作状态,方便程序调试工作。

    5、板载话筒、听筒接口:我们在板子设计了模块的话筒电路接口,用户只要直接焊上麦克风话筒即可摘机进行远程监听,也可以实现语音拨打电话的功能,听筒接口也已预留。

    6、1个LED指示灯:一个电源指示。

    7、优质RS232接口电路;通过电脑串口连接PC机,发送AT指令,也可以和单片机连接,使用单片机发送AT指令。串口接口电路使用SP3238标准芯片,9针信号线全部用上,而非使用简单的MAX232的2,3,5脚。

    8、9v直流电源输入:带电源指示灯。

    9、板载二极管电源插反极性保护,同时有保险丝过流保护电路,大电容滤波,PCB布局合理,大面积铺地,抗干扰性强,工业级的标准。

产品设计与加工工艺:

    1、使用波峰焊工艺,焊点漂亮,做工精致。
    2、贴片元件设计与加工工艺,所有电解电容使用昂贵的优质钽电容,保证电源稳定可靠。

套装清单:——售价:228元/套 (西门子 Siemens TC35/TC35i GSM 串口开发板)

    Siemens TC35/TC35i GSM 串口开发板:1块 (板上带有Siemens 西门子TC35模块,如需将标配更换成TC35i,需要补差价,请先电话和我们联系)

    外接电源:1个

    RS232串口线:1条

    配套光盘:1份

    GSM 专用天线:1个

    TC35 专用天线转接线:1个

光盘附送相关资料:

    AT指令集;SIEMENS_TC3x接口描述;Siemens TC35i数据手册

    TC35外围电路图及开发板电路原理图

    TC35测试程序(PC机端程序)

    TC35通过电脑发短信的实例程序(含VB源程序代码)

    串口调试助手软件

注意:该开发板可适用于TC35/TC35i/MC35/MC35i 模块,我们下面的介绍以TC35模块为例。

串口调试助手
GSM串口调试助手软件 2010年6月24日更新发布
这是我们为TC35开发板专门编写了GSM串口调试助手软件,调试AT指令,测试模块工作更为方便、快捷,功能强大。
大家可以从窗体中看到上半部分为知名的串口调试助手软件全部功能,下面我们专门编写了GSM调试功能,同时支持SIM300 GRPS模块的调试。

这是我们在2008年10期《无线电》杂志上刊登的TC35模块介绍文章,大家也可以直接翻阅《无线电》杂志。TC35i

    这是我们的“西门子 Siemens TC35/TC35i GSM 开发板”的操作演示视频录像,大家可以点击下载视频文件进行观看,视频中我们介绍了学习板的硬件和软件资料的情况以及初次使用的应用实例,大家可以做个参考,很多原理都是一样的。注意,为了达到最好的显示效果,请全屏播放进行观看

-->>下载高品质视频文件 http://www.hificat.com/tc35/tc35.rar



点击上面窗口进行在线播放,双击进行全屏观看

tc35i开发板

概述

     西门子GSM模块 (TC35/TC35i/MC35/MC35i) 开发(评估)板是采用51单片机+TC35(GSM)为核心部件综合实验板。单片机采用STC89C51系列MCU,最高工作速度可达90MHz,片内FLASH程序存储器和8K左右的片内EEROM,多达36个通用I/O口。通过RS232实现ISP编程;

    TC35(TC35i/MC35/MC35i)无线GSM/GPRS通信模块, 集成了标准的RS232接口以及SIM卡,可以在PC机上用AT命令通过串口对它进行设置。这使它成为在声音和数据通讯上通用的一个GSM/GPRS双频终端产品。 你可以快速的把它应用到产品开发上,同时它也可以作为产品的一个组成部分和产品结合在一起。在无线短信工业控制、远程通讯,现场监控等诸多无线通讯领域开发板将会给您的工作带来极大的便利.

    该板方便用户实验、开发,根据用户的设计思维自由组合很快将思想变为产品,无论用户有无GSM方面的知识累积,该板都是良好助手。

实验说明:

    ◆ 短信收发实验。

    ◆ 话音呼叫实验。

    ◆ AT指令实验。

TC35/TC35i 测试程序
TC35模块通过电脑联机,DEMO程序。

TC35/TC35i 中文短信

这是模块DEMO测试程序,我们可以用来读取模块预存的各种出厂信息,以及发送中文短信的实例应用。 直接点击图片放大观看。

TC35/TC35i 英文短信

这是模块DEMO测试程序,我们可以用来读取模块预存的各种出厂信息,以及发送英文短信的实例应用。 直接点击图片放大观看。

tc35 测试程序
另一款TC35模块测试程序,这个程序可以完成拨号操作,同时实时显示模块操作的各条AT指令,上图为连接模块初始化成功的反馈信息 “OK”。

TC35/TC35i 短信 另一款短信发送接收软件。

下面我们来看一下miniTC35开发板的一些硬件资源特写:

gsm开发板
RS232串口通信接口,支持串口AT指令的调试

tc35学习板
使用优质40PIN扁线座,方便与TC35模块进行连接,接触性好。注:其中 KinCony 为我公司使用的注册商标或商标,现已发现部分商家盗用我们的产品图片以及仿冒品,请大家认准KinCony商标,以便获得优质的服务和公司技术支持。

tc35i学习板
优质自弹式SIM卡插座,插入GSM手机SIM卡即可。元件全部使用优质贴片器件,质量稳定可靠。

TC35开发板
GSM专业设计,品质保证,该板可以直接配上TC35,TC35I,MC35,MC55等西门子GSM或GPRS模块

tc35i学习板
使用SP3238专业RS232电平转换芯片,而不是MAX232的电平转换,9针引脚全部有效。

tc35i开发板
    板载话筒电路和听筒电路,用户只要直接将麦克风、听筒和PCB进行连接即可。

tc35
板载上电自启动电路,上电自动启动TC35 GSM模块,无需再使用IO口去控制IGT管脚进行开机操作。

tc35开发板
批量现货供应的TC35串口开发板

串口调试助手

    这是我们给开发板上电时,通过串口调试助手软件看到的,TC35模块初始化时的各条指令。注意:+8613800571500 是浙江省杭州地区的移动短信服务中心号码,您给开发板使用不同地区的SIM卡,请在程序中设置正确的当地ISP移动电话服务商提供的短信中心号码。 

-------------------------------------------------------------------------------------------------------------------------------

西门子 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模块一个
2、SIM卡座一个
3、GSM天线转接线一根
4、GSM小天线一根
5、40芯专用排线及接插件一个

TC35i模块的详细英文PDF资料 >>下载

tc35i

TC35I西门子工业GSM模块 250元一个

40pin

40芯0.5mm间距扁平排线3厘米长 5元一个

40PIN 间距0.5mm 翻盖式专用排线卡座 5元一个 主要用于连接TC35I与目标板的连接。

天线转接线

TC35I专用天线转接线 10元一根 村田头转成SMA接口,主要用于TC35I模块和GSM天线的连接。是每个西门子模块必备的产品.

天线

GSM小天线(SMA接口) 10元一个

sim

这是SIM卡座 5元一个

lm2941

    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命令测试。最后用单片机调试。

以下是我们对TC35i模块进行维修中的照片,TC35和TC35i使用上基本上差不多,在外观形状上,TC35i比TC35略有不同。

tc35i
取下TC35i模块的屏蔽罩
tc35i
这是取下屏蔽罩后的样子,内部还有IC。
tc35i
使用热风枪对BGA芯片进行焊接
tc35i
使用热风枪对BGA芯片进行焊接

    进行串口调试时,可以先发送AT,看看TC35I模块是否能回答AT OK,如果行说明串口部分硬件正常,如果不能回复,请顺着串口的两根PCB走线检查,看看4053的两根飞线是否连接正确?TC35I排线座上的两根串口线是否接触不良?如果TC35I和单片机的供电电压相同,可以去掉220欧姆的保护电阻。

    还有AT命令比较复杂,不同生产日期的TC35I模块的AT指令可能有一些区别,请客户以实践为准耐心调试,一个复杂的系统完全指望别人是不可能成功的,请务必保持一定的心理准备。

-->>点击这里可以下载到详细的TC35I英文使用说明书

-->>点击这里可以下载到简编的中文AT指令

下面我们列举一些常用的AT指令:

控制端发送的AT指令
TC35回答
指令的功能
备注
AT
OK
通讯握手
AT+CLCC
OK
来电话时有信号输出
串口输出:RING
AT+CMGL=0
读取全部未读过的SMS消息
AT+CMGL=2
列出已有的短信息
AT+CMGL=4
读取全部SMS消息
AT+CMGR=X
读取第X条短消息
AT+CMGF=0
用PDU格式
AT+CMGD=X
删除第X条短消息
AT+CGSN
读取TC35I的序列号
例如:351254004238596
AT+CSCA
显示短信息中心地址
AT+CMGW
写短信息并存储。
ATD051383082087;
拨打051383082087电话
注意需要最后的分号
AT+CNMI=1,1,2
OK

设置收到短消息提示

例如:+CMTI:“SM”,4 4表示手机内短消息数量

    这是用串口调试助手成功发送的中文短信息完整过程,短信中心号码:13800513500 短信接收方号码:13306285091 短信内容:晚上好123 红色表示发送的内容,蓝色表示接收到的数据,黑色表示备注。

AT(回车)通讯握手
OK
AT+CMGF=0 设置为PDU模式,因为要发送中文汉字
OK
AT+CMGS=6
发送短消息的字节数
> 表示可以接收数据
0891683108503105F011000B813103265890F10008A90C665A4E0A597D003100320033 包含短信中心、接收方手机号码和短信内容的数据
1A 发送结束标志,一定要十六进制大写模式,不是ASIC码!(可以在串口调试助手中勾选十六进制选项)只有最后发送1A十六进制码后短信才会被成功发出!
+CMGS: 45

OK 表示第45条短信发送成功

下面分析这条信息:
08——表示短消息中心地址长度;
91——表示短消息中心号码类型;
68----中国代码
3108200905F0——表示短消息房层中心号码;1380 0290 500
0103——表示发送短消息的编码方式;
0D——表示目的地址长度;
91——表示目的地址类型;
683199312523F9——表示接收短消息的手机号码为13991352329(前面68是固定的,后面的手机号码每2位掉换一下位置,最后一位前面加入F)
3208——表示发送中文字符方式;
0C——表示短消息长度;
665A4E0A597D003100320033——表示发送中文字符的UNICODE码
汉字的中文内码: 665A{晚} 4E0A{上} 597D{好} 0031{1} 0032{2} 0033{3}。

单片机实现短信自动发送

进行短信发送的前提是短信内容的正确编码。经过以上对短信发送过程的分析,可以通过单片机对其进行实现。下面是实现程序例程:

/*-------------------------------------------------------------------------

函数名: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
  EDITTEXT IDC_SMSCONTENT_EDIT,39,61,242,38,ES_AUTOHSCROLL
  PUSHBUTTON "发送",IDC_SEND_BUTTON,316,80,45,18
  GROUPBOX "接收短消息",IDC_STATIC,28,124,361,167
  LTEXT "对方手机号",IDC_STATIC,41,35,42,11
  EDITTEXT IDC_PHONENUM_EDIT,88,30,192,17,ES_AUTOHSCROLL
  PUSHBUTTON "清除",IDC_CLEAR_BUTTON,316,30,45,18
  GROUPBOX "发送短消息",IDC_STATIC,29,19,361,95
  LISTBOX IDC_RECVSMS_LIST,43,137,331,127,LBS_SORT |
  LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
  PUSHBUTTON "接收",IDC_RECV_BUTTON,77,269,55,16
  PUSHBUTTON "清空",IDC_DELETEALL_BUTTON,273,268,45,14
END

  对话框类的消息映射为:

BEGIN_MESSAGE_MAP(CSMSControlDlg, CDialog)
//{{AFX_MSG_MAP(CSMSControlDlg)
  ON_WM_SYSCOMMAND()
  ON_WM_PAINT()
  ON_WM_QUERYDRAGICON()
  ON_BN_CLICKED(IDC_CLEAR_BUTTON, OnClearButton)
  ON_BN_CLICKED(IDC_SEND_BUTTON, OnSendButton)
  ON_BN_CLICKED(IDC_RECV_BUTTON, OnRecvButton)
  ON_BN_CLICKED(IDC_DELETEALL_BUTTON, OnDeleteallButton)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

 下面是对本例程软件的主要数据结构和核心函数的介绍:

  数据结构

// 用户信息编码方式
#define GSM_7BIT 0
#define GSM_8BIT 4
#define GSM_UCS2 8
// 短消息参数结构,编码/解码共用
// 其中,字符串以0结尾
typedef struct
{
  char SCA[16]; // 短消息服务中心号码(SMSC地址)
  char TPA[16]; // 目标号码或回复号码(TP-DA或TP-RA)
  char TP_PID; // 用户信息协议标识(TP-PID)
  char TP_DCS; // 用户信息编码方式(TP-DCS)
  char TP_SCTS[16]; // 服务时间戳字符串(TP_SCTS), 接收时用到
  char TP_UD[161]; // 原始用户信息(编码前或解码后的TP-UD)
  char index; // 短消息序号,在读取时用到
} SM_PARAM;

  发送短消息

  发送按钮对应的函数为CSMSControlDlg::OnSendButton,它读取用户输出并根据目标电话号码和短信息内容形成SM_PARAM(源PDU参数)的内容,接着进行发送:

void CSMSControlDlg::OnSendButton()
{
  // TODO: Add your control notification handler code here
  //获得用户输入
  CString desPhoneNum;
  CString smsContent;
  GetDlgItemText(IDC_PHONENUM_EDIT,desPhoneNum);
  GetDlgItemText(IDC_SMSCONTENT_EDIT,smsContent);

 //填充SM_PARAM结构体内容
  SM_PARAM smParam;
  smParam = CreateSMPARAMStruct(desPhoneNum,smsContent);

 //发送短信息
  gsmSendMessage(smParam);
}

  其中调用的gsmSendMessage函数体现了串口通信的核心内容,它按照第1节阐述的GSM模块发送短消息的串口控制流程进行短信的发送:

BOOL gsmSendMessage(const SM_PARAM *pSrc // pSrc: 源PDU参数指针)
{
  int nPduLength; // PDU串长度
  unsigned char nSmscLength; // SMSC串长度
  int nLength; // 串口收到的数据长度
  char cmd[16]; // 命令串
  char pdu[512]; // PDU串
                                                        char ans[128]; // 应答串

 nPduLength = gsmEncodePdu(pSrc, pdu); // 根据PDU参数,编码PDU串
  strcat(pdu, "\x01a"); // 以Ctrl-Z结束

 gsmString2Bytes(pdu, &nSmscLength, 2); // 取PDU串中的SMSC信息长度
  nSmscLength++; // 加上长度字节本身

 // 命令中的长度,不包括SMSC信息长度,以数据字节计
  sprintf(cmd, "AT+CMGS=%d\r", nPduLength / 2-nSmscLength); // 生成命令

 WriteComm(cmd, strlen(cmd)); // 先输出命令串

 nLength = ReadComm(ans, 128); // 读应答数据
 
  // 根据能否找到"\r\n> "决定成功与否
  if (nLength == 4 && strncmp(ans, "\r\n> ", 4) == 0)
  {
   WriteComm(pdu, strlen(pdu)); // 得到肯定回答,继续输出PDU串

  nLength = ReadComm(ans, 128); // 读应答数据
                                                                                     
   // 根据能否找到"+CMS ERROR"决定成功与否
   if (nLength > 0 && strncmp(ans, "+CMS ERROR", 10) != 0)
   {
    return TRUE;
   }
  }
  return FALSE;
}

  读取短消息

  点击"接收"按钮会通过gsmReadMessage函数的调用获得所有短消息,最后在列表控件中显示所有短信:

void CSMSControlDlg::OnRecvButton()
{
  // TODO: Add your control notification handler code here
  SM_PARAM smParam[100];//短信缓冲区
  int smsNum;//短信条数
  smsNum = gsmReadMessage(smParam);//读取短信

 //显示短信
  for(int i=0;i<smsNum;i++)
  {
   m_recvlist.AddString(CString(smsNum[i].TPA)+smsNum[i].TP_UD);
  }
}
   其中调用的gsmReadMessage函数完成最核心的短信接收功能,它按照第1节阐述的GSM模块接收短消息的串口控制流程进行短信的接收:

// 参数:pMsg 短消息缓冲区,必须足够大
// 返回:短消息条数
int gsmReadMessage(SM_PARAM* pMsg)
{
  int nLength; // 串口收到的数据长度
  int nMsg; // 短消息计数值
  char* ptr; // 内部用的数据指针
  char cmd[16]; // 命令串
  char ans[1024]; // 应答串

 nMsg = 0;
  ptr = ans;

 sprintf(cmd, "AT+CMGL\r"); // 生成命令,用+CMGL可一次性读出全部短消息
                  
  WriteComm(cmd, strlen(cmd)); // 输出命令串
  nLength = ReadComm(ans, 1024); // 读应答数据
  // 根据能否找到"+CMS ERROR"决定成功与否
  if(nLength > 0 && strncmp(ans, "+CMS ERROR", 10) != 0)
  {
   // 循环读取每一条短消息, 以"+CMGL:"开头
   while((ptr = strstr(ptr, "+CMGL:")) != NULL)
   {
    ptr += 6; // 跳过"+CMGL:"
    sscanf(ptr, "%d", &pMsg->index); // 读取序号
                   
    ptr = strstr(ptr, "\r\n"); // 找下一行
    ptr += 2; // 跳过"\r\n"

   gsmDecodePdu(ptr, pMsg); // PDU串解码
    pMsg++; // 准备读下一条短消息
    nMsg++; // 短消息计数加1
   }
  }
   return nMsg;
}

删除短消息

  我们可以在读取完所有短信息后调用gsmDeleteMessage函数在GSM模块上删除那些已经被接收到PC上的短信息,它按照第1节阐述的GSM模块删除短消息的串口控制流程进行短信的删除:

// index: 短消息序号,从1开始
BOOL gsmDeleteMessage(const int index)
{
  int nLength; // 串口收到的数据长度
  char cmd[16]; // 命令串
  char ans[128]; // 应答串

 sprintf(cmd, "AT+CMGD=%d\r", index); // 生成命令

 // 输出命令串
  WriteComm(cmd, strlen(cmd));

 // 读应答数据
  nLength = ReadComm(ans, 128);

 // 根据能否找到"+CMS ERROR"决定成功与否
  if (nLength > 0 && strncmp(ans, "+CMS ERROR", 10) != 0)
  {
   return TRUE;
  }
  return FALSE;
}

  在PC控制软件的短信列表框中删除所有短消息的"清空"按钮函数为:

void CSMSControlDlg::OnDeleteallButton()
{
  // TODO: Add your control notification handler code here
  m_recvlist.ResetContent();
}

  设置/读/写串口

  在应用程序启动与退出及gsmSendMessage、gsmReadMessage和gsmDeleteMessage函数中广泛使用的串口相关函数用WIN32 API实现:

// 串口设备句柄
HANDLE hComm;

// 打开串口
// pPort: 串口名称或设备路径,可用"COM1"或"\\.\COM1"两种方式,建议用后者
// nBaudRate: 波特率
// nParity: 奇偶校验
// nByteSize: 数据字节宽度
// nStopBits: 停止位
BOOL OpenComm(const char *pPort, int nBaudRate, int nParity, int nByteSize, int
nStopBits)
{
  DCB dcb; // 串口控制块
  COMMTIMEOUTS timeouts =
  {
   // 串口超时控制参数
   100, // 读字符间隔超时时间: 100 ms
   1, // 读操作时每字符的时间: 1 ms (n个字符总共为n ms)
   500, // 基本的(额外的)读超时时间: 500 ms
   1, // 写操作时每字符的时间: 1 ms (n个字符总共为n ms)
   100
  }; // 基本的(额外的)写超时时间: 100 ms

 hComm = CreateFile(pPort, // 串口名称或设备路径
   GENERIC_READ | GENERIC_WRITE, // 读写方式
   0, // 共享方式:独占
   NULL, // 默认的安全描述符
   OPEN_EXISTING, // 创建方式
   0, // 不需设置文件属性
   NULL); // 不需参照模板文件

 if (hComm == INVALID_HANDLE_VALUE)
   return FALSE;
  // 打开串口失败

 GetCommState(hComm, &dcb); // 取DCB
  dcb.BaudRate = nBaudRate;
  dcb.ByteSize = nByteSize;
  dcb.Parity = nParity;
  dcb.StopBits = nStopBits;

 SetCommState(hComm, &dcb); // 设置DCB
 
  SetupComm(hComm, 4096, 1024); // 设置输入输出缓冲区大小

 SetCommTimeouts(hComm, &timeouts); // 设置超时
  return TRUE;
}

// 关闭串口
BOOL CloseComm()
{
  return CloseHandle(hComm);
}

// 写串口
// pData: 待写的数据缓冲区指针
// nLength: 待写的数据长度
void WriteComm(void *pData, int nLength)
{
  DWORD dwNumWrite; // 串口发出的数据长度
  WriteFile(hComm, pData, (DWORD)nLength, &dwNumWrite, NULL);
}

// 读串口
// pData: 待读的数据缓冲区指针
// nLength: 待读的最大数据长度
// 返回: 实际读入的数据长度
int ReadComm(void *pData, int nLength)
{
  DWORD dwNumRead; // 串口收到的数据长度
  ReadFile(hComm, pData, (DWORD)nLength, &dwNumRead, NULL);
  return (int)dwNumRead;
}
  编/解码GSM短消息

  陷于本文的篇幅,这里只给出编解码函数的原型,具体请参看GSM标准及《通过串口收发短消息》一文。

// UCS2编码 返回: 目标编码串长度
int gsmEncodeUcs2(const char *pSrc, // 源字符串指针
  unsigned char *pDst, // pDst: 目标编码串指针
  int nSrcLength // nSrcLength: 源字符串长度
);

// UCS2解码 返回: 目标字符串长度
int gsmDecodeUcs2(const unsigned char *pSrc, //源编码串指针
char *pDst, // pDst: 目标字符串指针
int nSrcLength // nSrcLength: 源编码串长度
);

//可打印字符串转换为字节数据 返回: 目标数据长度
//如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
int gsmString2Bytes(const char *pSrc, // pSrc: 源字符串指针
unsigned char *pDst, // pDst: 目标数据指针
int nSrcLength // nSrcLength: 源字符串长度
);

// 字节数据转换为可打印字符串 返回: 目标字符串长度
// 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01"
int gsmBytes2String(const unsigned char *pSrc, // pSrc: 源数据指针
char *pDst, // pDst: 目标字符串指针
int nSrcLength // nSrcLength: 源数据长度;

--->>>返回首页



专业生产 智能家居控制系统 GSM远程遥控开关 串口继电器控制盒 GPRS MODEM 单片机开发板 电子制作散件套件
我们专注于智能家居控制系统,GPRS数据采集系统,物联网智能控制方向 晶控电子----让我们的生活更美好 品质更卓越 生活更智能
联系地址:浙江省杭州市登云路428号 浙江时代电子市场4楼852室 邮政编码:310011 Email:hificat@163.com
电话总机:0571-88009850   产品咨询:转分机1   技术支持:转分机2   传真:转分机3   手机:13185018567
销售QQ:1198450005 销售咨询 技术QQ-1:1275636157 技术咨询 技术QQ-2:420951892 技术咨询
杭州晶控电子有限公司 版权所有 2003-2012 HANGZHOU KinCony ELECTRONICS CO.,LTD 网站备案:浙ICP备11001927号