短信息服务作为GSM 系统为用户提供的一种基本数字业务,已经得到越来越多的系统运营商和系统开发商的重视,成为诸多领域远程监控的一种通信手段,很多应用场合需要通过PC直接控制短信息收发功能,完成系统的数据采集或远程信息传输,在一些偏远架设通信线路比较困难的地区,尤其需要用户直接通过PC控制短信息的远程传输。
本文通过介绍西门子公司TC35i GSM 的PC机短信息收发模块,详细阐述TC35i和PC之间的硬件连接及部分接口电路原理,PC通过软件编程利用AT指令控制模块工作,实现短信息的收发功能。该模块可应用于多个领域的远程信息传输系统,特别适用于需频繁传送小数据量的远程信息传输系统,如铁路远程信息传输、电力远程抄表和水利远程监控等领域。
硬件设计
针对TC35i模块与PC连接的电源接口、通信接口和控制接口等接口存在的一些问题,采取有效的方法实现两者硬件电路的连接,TC35i模块安装在PC内部,由PC电源供电,同时通过PC串行口实现数据交换,再经软件编程实现模块启动、关闭的收发功能。
TC35i模块TC35i模块是西门子公司推出的一种无线通信模块,它是集射频电路、基带于一体,向用户提供标准的AT命令接口,为数据、语音、短信息和传真提供快速、可靠、安全的传输,方便用户的开发设计及应用。
TC35i模块应用接口采用40脚的Zip插座,包含的引脚功能有:3.3~5.5V、峰值为2A的直流电源接口,模拟音频输入、输出接口,8个引脚的标准RS232信号接口,6个引脚符合GSM11.11标准的SIM 卡连接、控制接口。本文应用4个接口,电源接口、控制接口、串行通信接口及SIM卡连接接口。
系统结构
系统结构图如图1所示,为增强系统的灵活性,TC35i模块直接由PC内部5V电源供电,PC与TC35i模块通过串行通讯的RxD、TxD和地线三线制完成通讯,串行通讯的DTR和RTS接口与TC35i模块的控制接口连接,实现PC通过软件对短信息收发模块的控制和数据交换。
电源接口电路
电源接口电路如图2所示,除提供整个模块的5V工作电压外,最主要的是为TC35i模块提供工作电压。
TC35i模块工作电压为3.3~5 V,稳定工作电压4.4V左右,在启动连接登陆网络的传输过程中要求电源能提供2 A的峰值电流、不大于400 mV的压降,因为在数据传输过程中当电压的波动大于400 mV时,TC35i模块认为工作电压过低而自动关闭TC35i模块,因此在设计TC35i模块的电源时必须考虑电压下降的可能性,保证最小电压高于4V。PC直流输出电压通过比较电路与基准电压进行比较,误差电压由通/断时间比例控制电路调整直流输出电压,线路滤波器防止交流信号噪声输入,抑制电源内部产生的反馈噪声。控制接口电路
控制接口电路的目的是利用PC串行通讯的DTR和RTS信号线分别控制TC35i模块IGT点火线和EMERG0FF强制关闭线,实现PC对TC35i模块的启动和关闭控制。启动TC35i模块时,为使TC35i模块上电10ms后(供电电压必须大于4V)正常工作,须在IGT引脚加时长至少为100ms的低电平信号,该信号下降沿时间小于1ms,启动后IGT引脚的信号保持高电平;关闭TC35i模块时,须在EMERG0FF引脚加一个时长至少为3.2s的低电平信号。
一般设计中,上述延时直接通过PC机软件编程即可实现整个模块的启动和关闭控制,但在实际设计过程中发现,PC启动过程中DTR引脚和RTS引脚存在一个约4s左右的波动,波形图如图3所示,如果该波动不滤除,将会引起TC35i模块的非正常启动,本接口电路采用RC延时电路和施密特触发器滤除该波动信号,部分控制接口电路如图4所示。
数据通信接口电路
数据通信接口电路完成短信息收发及与PC通信等功能,TC35i模块与PC串行口使用简单的三线制进行数据交换。因PC的RS232接口和TC35i模块串行接口的电平规范不同,本文使用简单的施密特触发器、稳压管和电阻实现RxD和TxD电平转换,电路如图5所示。
软件设计
通过VC++6.0语言实现软件编程,PC首先通过编程打开与TC35i模块相连的串行口,然后通过此串行口向模块发送各种AT指令,实现对TC35i模块的控制,完成短信息收发功能。
串行口初始化在Windows环境下,常用编程实现串行口操作的方法除利用MSComm控件和某些现成的串行口通信外,还可以直接调用Windows API实现,程序如(程序1):
(程序1)
HANDLE hComm; //串行口设备控制
BOOL OpenComm (const char* pPort,int nBaudRate,int nParity,int nByteSize,int nStopBits)
{
DCB dcb; //串行口控制块
COMMTIMEOUTS timeouts={//串行口超时控制参数
100,//读字符间隔超时时间:100 ms
1,//读操作时每字符的时间:1 ms
500,//基本的(额外的)读超时时间:500 ms
1,//写操作时每字符的时间:1 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
SetuDComm(hComm,4096,1024);//设置输入输出缓冲区大小
::SetCommTimeouts(hComm,&timeouts); // 设置超时
return TRUE;
};
TC35i模块启动TC35i模块在系统上电10ms后,IGT引脚加时长至少100ms、下降沿时间小于1ms的低电平信号,完成模块的正常启动,模块启动时利用软件控制串行口DTR引脚的电平转换,DTR引脚的状态作为串行口的一个属性与波特率、数据位长度、校验位、停止位等一样保存在串行口的状态结构DCB结构中,设置DTR引脚状态时,只需保持串行口状态结构中的其他属性不变,控制程序如(程序2)
(程序2)
void EnableDTR() //设置DTR有效
{
DCB dcb;
GetCommState(hComm,&dcb); //取DCB
dcb.fDtrControI=DTR_CONTROL_ENABLE;
SetCommState(hComm,&dcb); //设置DCB
}
void DisableDTR()//设置DTR无效
{
DCB dcb;
GetCommState(hComm,&dcb); //取DCB
dcb.fDtrControl=DTR_CONTROL_DISABLE;
SetCommState(hComm,&dcb); //设置DCB
}
在控制接口电路中为滤除DTR引脚的电平波动,利用硬件电路实现DTR引脚由低电平到高电平延时的,软件控制模块启动过程中需跨过相同的延时时间,模块启动程序如(程序3):
(程序3)
void SMSStart(void) //模块启动
{
DisableRTS();//禁止RTS,将PowerDown设为HiZ高阻态
EnableDTR();
Sleep(11000);//跨过延时时间,此数值根据硬件电路可调
DisableDTR();
}
AT命令
AT命令集是SMS的DTE-DCE接口标准,是用户控制TC35i模块工作的媒介,利用TC35i模块和进行TC35i模块二次开发都须向模块发送AT命令完成,TC35i模块的命令接口完全符合GSM07.05和GSM07.07规范。PC通过串行口向TC35i模块发送AT命令,同时接收模块对发送的返回信息通过对串行口的读、写操作实现模块的收发功能。串行口的发送、接收程序如(程序4):
(程序4)
//pData:待写的数据缓冲区指针
//nLength:待写的数据长度
void WriteCom(void *pData,int nLength)//发送程序
{
DW0RD dwNumWrite; //串行口发出的数据长度
WriteFile(hComm,pData,(DWORD)nLength,
&dwNumWrite,NULL);
}
//pData:待读的数据缓冲区指针
//nLength:待读的最大数据长度
//返回:实际读入的数据长度
int ReadCom(void *pData,int nLength) //接收程序
{
DWORD dwNumRead; //串行口收到的数据长度
ReadFile(hComm,pData,(DWORD)nLength,
&dwNumRead,NULL);
return (int)dwNumRead;
}
短信息收、发
目前通过GSM无线模块收发短信息主要分为Block模式、Text模式和PDU模式三种模式。Block模式已逐渐被PDU模式取代;Text模式收发短信息原理简单,程序实现比较容易,缺点是只能收发英文信息不能收发中文信息;PDU模式则完全可以解决这个问题,通过PDU编码的短信息内容既可以是英文信息也可以是中文信息。
TC35i模块设置为PDU模式,通过向TC35i模块发送AT命令和PDU串完成短信息的发送,相应的AT命令为:AT+CMGS=<Length><CR>,其中Length为本条短信息发送字符的总长度,<CR>是回车符号即0x0D,向TC35i模块发送此命令后,等待TC35i模块返回“>”ASCll字符,同时将已经编码的PDU串发送至TC35i模块,并以Ctrl+Z(0x1A)结尾,TC35i模块接收到PDU串后开始发送短信息,短信息发送成功后TC35i模块返回<CRLF>OK<CRLF>,<CRLF>是回车换行符号。
接收短信息时,TC35i模块根据用户的设置决定是否向用户发送短信息到达的提示,短信息到达提示的格式为:<CRLF>+CMTI:“SM”,INDEX(信息存储位置)<CRLF>,用户收到短信息到达提示后,向TC35i模块发送:AT+CMGR=INDEX<CRLF>命令,读取相应短信息的PDU串。若用户设置TC35i模块时关闭了短信息到达提示,则用户可以利用AT+CMGL指令列出所有接收后未阅读的短信息,模块将返回所有未阅读的短信息的PDU串。
TC35i模块关闭
系统退出时须将TC35i模块关闭。TC35i模块提供两种关闭方式,系统正常退出时,利用AT^SMSO指令关闭TC35i模块,模块接收到AT^SMSO指令后,进行关机操作并返回^SMSO: MSOFF<CRLF>OK:当系统出现异常情况软件关闭失败时,利用TC35i模块的强制关闭功能,即TC35i模块停止响应的时间超过5秒时,在EMERGOFF强制关闭线加一个不小于3.2秒的低电平信号实现强制关机,即对PC机的串行口RTS线进行相应的操作。
结束语
本文实现了PC在TC35i GSM模块上的短信息收发功能,解决了PC启动时串行口不规则信号对模块的影响,软件实现了PC直接控制模块启动、关闭功能。短信息传输具有覆盖面广、自动传送、费用低、稳定性好等优点,正成为一种廉价、实用、高效无线数据双向传送、无线远程监测和控制的解决方案,同时结合TC35i GSM模块的系统设计结构简单,使用方便。