插手珍藏夹
 公司简介 || 产物列表 || 采办编制 || 汇款订单提交 || 论坛 || 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.agpgames.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数据采集系统,物联网智能节制标的目的 澳门新濠天地电子----让咱们的糊口生计更夸姣 质量更杰出 糊口生计更智能
联系地址:浙江省杭州市西湖科技园西园七路3号4层 邮政编码:310011 Email:hificat@163.com
德律总机:0571-87615070
发卖QQ:1198450005 发卖征询 技术QQ-1:1275636157 技术征询 技术QQ-2:420951892 技术征询
杭州澳门新濠天地电子有限公司 版权所有 2003-2017 HANGZHOU KinCony ELECTRONICS CO.,LTD 网站备案:浙ICP备11001927号