EDN首页   博客首页

日志档案

发表于 2008-6-6 17:41:40

1

标签: 无标签

一步一步写一个短信SMS协议栈FreeSmsStack(1)

一步一步写一个短消息收发协议栈(1

――基于TC35iATMega32的短消息协议栈FreeSmsStack

V1.0

bpesun@163.com

1.     目的

本项目的目的是完成一个建立在TC35i模块上的短消息协议栈。我给这个协议栈起的名字是FreeSmsStack。从名字上可以看出,这个协议栈是一个免费的开源协议栈。

短消息业务(SMS)作为GSM的一种增值服务,随着GSM网络覆盖范围的不断扩大,得到了迅速发展,它具有传输速度快,费用低,不占用语音通信通道等优点,因而在远程智能控制系统中得到了广泛的应用,如:基于GSMGPS的车辆跟踪监视系统,基于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的第15引脚是正电源输入脚通常推荐值4.2V,第610引脚是电源地。1112为充电引脚,可以外接锂电池,13为对外输出电压(共外电路使用)14ACCU-TEMP接负温度系数的热敏电阻,用于锂电池充电保护控制。

15脚是启动脚IGT,系统加电后为使TC35i进入工作状态,必须给IGT加一个大于100ms的低脉冲,电平下降持续时间不可超过1ms

1623为数据输入/输出,分别为DSR0RING0RxD0TxD0CTS0RTS0DTR0 DCD0tc35i模块的数据输入/输出接口实际上是一个串行异步收发器,符合ITU-T RS232接口标准。它有固定的参数:8位数据位和1位停止位,无校验位,波特率在300bps~115kbps之间可选,默认9600。硬件握手信号用RTS0/CTS0,软件流量控制用XON/XOFFCMOS电平,支持标准的AT命令集。

其中18RXD19TXDTTL的串口通讯脚,需要和单片机或者PC通讯。

TC35i使用外接式SIM, 2429SIM卡引脚,SIM卡同TC35i是这样连接的:SIM上的CCRSTCCIOCCCLCCVCCCCGND通过SIM卡阅读器与TC35i的同名端直接相连,ZIF连接座的CCIN引脚用来检测SIM卡是否插好,如果连接正确,则CCIN引脚输出高电平,否则为低电平。

TC35i的第32SYNC引脚有两种工作模式,一种是指示发射状态时的功率增长情况,另一种是指示TC35i的工作状态,可用AT命令AT+SYNC进行切换,本模块使用的是后一种。当LED熄灭时,表明TC35i处于关闭或睡眠状态;当LED600 ms/600ms熄时,表明SIM卡没有插入或TC35i正在进行网络登录;当LED75 ms/3s熄时,表明TC35i已登录进网络,处于待机状态。

303132脚为控制脚,其中30RTC backup31Power down32 SYNC

    3538为语音接口,3536接扬声器放音。3738可以直接接驻极体话筒来采集声音(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信号灯、串口连接(TXDRXD分别接单片机的TXDRXD,以及一些辅助的电阻连接。IGT是点火控制信号,MVDD可以用来监测模块是否启动。图中未注明的管脚可以悬空。

点击开大图

3.5. 调试串口

为了方便调试,可以增加一个调试串口。如果选择的单片机是具有双串口的单片机,那么可以将第二个串口作为调试串口,通过MAX3232等电平转换芯片变成RS232电平,连接PC串口。如果你选择的单片机只有一个串口,也没有问题,只需要将串口复用(单片机的串口既连接TC35i又连接电平转换芯片),同样通过一个电平转换芯片进行转换并连接到PC。编程的过程中,我们可以将一些调试信息通过这个串口输出到我们的串口助手上,方便我们调试。

串口调试软件网上有好多,但是我推荐使用SSCOM32。大家可以在网上搜索并下载。

4.     熟悉AT命令

4.1. 先看AT命令的语法

准备好硬件,就可以进行我们的协议栈的编写了。在编写之前,我们先了解一下微控制器跟TC35i进行通信所使用的AT命令。如果你以前没有接触过AT命令的化,这一部分内容需要仔细看一下,记得很久以前,那时候手机还不是很多,我们的一个项目想使用手机短信来控制家电,让我做项目预研。那个时候刚刚接触微控制器不久,并且还没有养成好的学习习惯,所以在网上匆匆查了些资料就开始“动手做东西”。那时候我的硬件是一个NOKIA的手机,要通过手机数据线连接PC。按照资料,先做一个无源的TTLRS232转换器,然后连接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