一步一步写一个短消息收发协议栈(1)
――基于TC35i和ATMega32的短消息协议栈FreeSmsStack
V1.0
bpesun@163.com
1. 目的
本项目的目的是完成一个建立在TC35i模块上的短消息协议栈。我给这个协议栈起的名字是FreeSmsStack。从名字上可以看出,这个协议栈是一个免费的开源协议栈。
短消息业务(SMS)作为GSM的一种增值服务,随着GSM网络覆盖范围的不断扩大,得到了迅速发展,它具有传输速度快,费用低,不占用语音通信通道等优点,因而在远程智能控制系统中得到了广泛的应用,如:基于GSM和GPS的车辆跟踪监视系统,基于GSM的远程LED信息发布系统等。
2. FreeSmsStack协议栈的功能
目前,这个协议栈能完成如下的功能:
ü 中、英文短信发送
ü 中、英文短信接收
ü 短信删除
ü 振铃后挂断来电并且反馈短信到来电号码
ü 普通AT命令发送
注意:目前,中文短信编码不能通过单片机实现,只能通过查表的方式将某些短信编码存储在单片机中。
3. FreeSmsStack协议栈对硬件的需求
下面列出的是本协议栈在所有功能使能的情况下对单片机的需求,可以看出普通的中档次的单片机都能满足要求。
ü 具有一个串口,具备发送寄存器空中断和接收到中断
ü 具有一个定时器
ü RAM最好有1.5K以上(实现全部功能)
3.1. 项目硬件
项目的硬件结构如下图所示。主要由GSM模块TC35i、单片机ATmega32、电源等模块组成。单片机和TC35i模块之间通过TTL串口进行通信。
下面简单介绍一下项目中所用到的硬件。
3.2. TC35i
短消息模块采用西门子的TC35i。该模块的特性如下。
|
特 性 |
说 明 |
|
信息传送内容 |
语音和数据 |
|
电源 |
单电源 3.3V ~ 4.8V |
|
频段 |
双频GSM900MHz 和 DCS1800 MHz(Phase 2+) |
|
发射功率 |
2W (GSM900MHz Class 4) 1W (DCS1800MHz Class 1) |
|
SIM 卡连接方式 |
外接 |
|
天线 |
由天线连接器连接外部天线 |
|
温度范围 |
工作温度:-20°C to +55°C 储存温度:-30°C to +85°C |
|
工作电流损耗 |
通话模式: 300mA (典型值.)
空闲模式: 3.0mA (最大值)
省电模式: 50μA (最大值) |
|
短信息 |
MT, MO, CB 和 PDU 模式 |
|
外型尺寸 |
54.5 x 36 x 3.6mm |
|
通讯接口 |
RS232(指令和数据的双向传送) |
|
SIM卡操作电压 |
3V/1.8V |
|
电话薄功能 |
存储于SIM卡中 |
|
模块复位 |
采用AT指令或掉电复位 |
|
串口通讯波特率 |
300bps...115kbps |
|
自动波特率范围 |
4.8kbps...115kbps |
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是话筒负端)
单片机通过两根I/O口控制TC35的开关机、复位等,通过串口与TC35进行数据通信。本项目通信速率为4800bps,采用8位异步通讯方式,1位起始位,8位数据位,1位停止位。
TC35模块输入输出的TTL正电平逻辑不是+5V,而是+2.9V,因此必要时加端口保护。
3.3. 电源
模块的供电电压如果低于3.3V会自动关机。同时模块在在发射时,电流峰值可高达2A。同时在此电流峰值时,电源电压(送入模块的电压)下降值不能超过0.4V。所以该模块对电源的要求较高,理想工作电压是4.2V。
我们这里只列出几种经过验证的开关电源方案,具体的实施原理可以参考数据手册或者网上的资料。第一,使用可调DC-DC电源芯片LM2941S。第二,使用DC-DC控制器,如R1224N102E。
3.4. 具体连接示例
下图是我在项目中使用的TC35i连接图。主要的连接包括:电源连接、SIM卡连接、SYNC信号灯、串口连接(TXD和RXD分别接单片机的TXD和RXD),以及一些辅助的电阻连接。IGT是点火控制信号,MVDD可以用来监测模块是否启动。图中未注明的管脚可以悬空。

3.5. 调试串口
为了方便调试,可以增加一个调试串口。如果选择的单片机是具有双串口的单片机,那么可以将第二个串口作为调试串口,通过MAX3232等电平转换芯片变成RS232电平,连接PC串口。如果你选择的单片机只有一个串口,也没有问题,只需要将串口复用(单片机的串口既连接TC35i又连接电平转换芯片),同样通过一个电平转换芯片进行转换并连接到PC。编程的过程中,我们可以将一些调试信息通过这个串口输出到我们的串口助手上,方便我们调试。
串口调试软件网上有好多,但是我推荐使用SSCOM32。大家可以在网上搜索并下载。
4. 熟悉AT命令
4.1. 先看AT命令的语法
准备好硬件,就可以进行我们的协议栈的编写了。在编写之前,我们先了解一下微控制器跟TC35i进行通信所使用的AT命令。如果你以前没有接触过AT命令的化,这一部分内容需要仔细看一下,记得很久以前,那时候手机还不是很多,我们的一个项目想使用手机短信来控制家电,让我做项目预研。那个时候刚刚接触微控制器不久,并且还没有养成好的学习习惯,所以在网上匆匆查了些资料就开始“动手做东西”。那时候我的硬件是一个NOKIA的手机,要通过手机数据线连接PC。按照资料,先做一个无源的TTL到RS232转换器,然后连接PC。最后,通过串口助手测试AT命令。看资料上写着发送“AT”应该回复“OK”,于是敲“AT”进去,可怎么也不见“OK”回来。于是又怀疑是硬件问题,又去重新做硬件连线,然后再试验,仍然没有数据反馈回来。然后拿其他命令来试验,仍然不行。折腾几天,仍然没有结果,领导只好取消这个项目。当几年后再学习AT命令的时候,突然发现了我当时的问题所在:还没有弄清楚AT命令是怎么样的结构就去盲目地试验——我们发送AT命令的时候,需要用“\r”做为结束符号,而我当年发的所有的AT命令都没有加“\r”这个符号,又怎么可能有“OK”回来哪?惭愧啊,一个很好的项目也由于我的低级错误而被扼杀了。
AT命令语法
还是先看几个例子吧。
AT\r
\r\nOK\r\n
我们发送AT握手信号,以“\r”为结束符号。
TC35i模块反馈一个“OK”,“OK”的前后都是“\r\n”字符。
下面是在网上找的几个例子,省略了发送时候的“\r”,每个开始新行的地方起始都省略了“\r\n”。你可以看着官方的AT命令手册来看具体的含义,或者你暂时不去弄懂也可以,而是在编程的时候再去参考一下AT指令手册。
例如下面的命令:
AT+CNMI=? (查看能支持的设置范围)
+CNMI: (0-2),(0-3),(0,2,3),(0,1),(0,1)\r\n
OK
将上面的命令补齐后,看起来应该如下所示:
AT+CNMI=?\r (查看能支持的设置范围)
\r\n+CNMI: (0-2),(0-3),(0,2,3),(0,1),(0,1)\r\n
\r\nOK\r\n
AT+CNMI? (查看当前设置)
+CNMI: 0,0,0,0,0
OK
AT+CNMI=2,1 (设置为mode=2, mt="1")
OK
AT+CNMI? (再查看当前设置)
+CNMI: 2,1,0,0,0
OK
(过了一段时间,有一条消息到达)
+CMTI “ME”,8 (通知:消息已经存储在ME内存中,序号为8)
AT+CMGR=8 (读第8条消息)
+CMGR: 8,27
0891683108200505F0240D91683158812764F80000402052110373800741E19058341E01
OK
你如果有短消息模块的话,用户可以通过串口助手来试验这些AT命令。仔细分析命令和应答之间的特殊字符(\r\n)。如果没有的话,就记住下面的AT