




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
pc机串口控制gsm模块收发短信系统设计 摘 要 sms短信息服务作为gsm网络的一项基本业务已得到越来越多的系统运营商和系统开发商的重视,以gsm网络作为数据无线传输网络,可以开发出多种前景极其乐观的应用。本文只讨论通过pc机串口控制gsm终端模块实现中英文短信息收发的程序设计,以实现测控数据通过gsm网络在个人计算机上的收发、存储和处理,并详细讨论pdu模式的短信息格式和中文短信息软件编解码的设计。 关键词 sms;pc机串口;gsm模块;at指令;pdu编码解码1 引言sms(shortmessageservice)短信息服务是gsm(globalsystemformobilecommunication)系统中提供的一种gsm终端(手机)之间,通过短信服务中心(servicecenter)进行文本信息收发的应用增殖服务,其中服务中心完成信息的存储和转发功能。短信息服务作为gsm网络的一种基本业务,已得到越来越多的系统运营商和系统开发商的重视,基于这种业务的各种应用也蓬勃发展起来。以gsm网络作为数据无线传输网络,可以开发出多种前景极其乐观的应用,如无线数据的双向传送、无线远程检测和控制等。典型的应用有:变电站、电表、水塔、水库或环保监测点等监测数据的无线传输和无线自动警报;远程无线控制高压线路断电器、加热系统、防洪拦阻系统或其它机电系统的启动和关闭;车队交通管理和控制指挥系统;控制和监测香烟、食品和饮料自动售货机的运行状态和存货水平等等。本文选用gsm模块benq m22,通过建立pc机的串行口程序,对该模块进行控制,以实现短信息的收发,在pc和应用系统(手机或各种监测系统)之间以gsm网络为纽带,即可实现远距离的数据传输。由于gsm网络在全国范围内实现了联网和漫游,具有网络能力强的特点,用户无需另外组网,在极大提高网络覆盖范围的同时为客户节省了昂贵建网费用和维护费用。同时,它对用户的数量也没有限制,克服了传统的专网通信系统投资成本大,维护费用高,且网络监控的覆盖范围和用户数量有限的缺陷。比起传统的集群系统在无线网络覆盖上具有无法比拟的优势,加上gsm的sms本身具备的数据传送功能,都使得这些应用得到迅速的普及。利用gsm短信息系统进行无线通信还具有双向数据传输功能,性能稳定,为远程数据传送和监控设备的通信提供了一个强大的支持平台。2 系统总体框图设计与原理概述2.1 系统总体框图整个通信系统分为传输网络和终端两个大部分,传输网络则利用了现有的gsm网络,而终端可以是手机终端或者是具有手机短信功能的模块终端,为了实现对数据的存储和处理,在终端加入了功能强大的个人计算机作为系统的控制中心,计算机与模块终端则通过串口进行通信。系统的总体框图如图1所示:gsm网络m22 模块sim卡电源串口手机终端pc机图1 系统总体框图2.2 程序设计语言概述以及系统的界面设计visual basic是一种可视化的、面向对象和采用事件驱动方式的结构化高级程序设计语言,可用于开发windows环境下的种类应用程序。在visual basic环境下,利用事件驱动的编程机制、新颖易用的可视化设计工具,使用visual basic com组件和windows内部的应用程序接口(api)函数等,可以高效、快速地开发出windows环境下功能强大、图形界面丰富的应用程序软件系统。在visual basic环境下设计的系统界面如图2所示:图2 系统界面2.3 at指令介绍2.3.1 at指令概述pc机串口和gsm引擎之间采用at指令实现相互之间的通信,因此有必要先了解一下at指令的格式和一些与本设计系统有关的常用指令。pc机串口发出的at指令用来建立通信链路,at指令集的命令格式帧都以at开头,“at”或者“at”的前缀必须出现在每条命令行的开始。值为键入的设置值,是命令语法要求的一部分。如果该值可选,那么用方括号加以区分。当用at指令命令设置了一个参数,那么这个值在它被改变之前一直是有效的。2. 3. 2 benq m22模块中与sms有关的gsm at指令介绍gsm引擎模块提供的命令接口符合gsm07.05和gsm07.07规范。gsm07.07中定义的at command接口,提供了一种移动平台与数据终端设备之间的通用接口;gsm07.05对短消息作了详细的规定。在短消息模块收到网络发来的短消息时,能够通过串口发送指示消息,数据终端设备可以向gsm模块发送各种命令。gsm at指令集,是由诺基亚、爱立信、摩托罗拉和hp等厂家共同为gsm系统研制的,其中包含了对sms(short message service)的控制。与sms有关的gsm at指令如表1所示:表1 与sms相关的若干gsm at指令at指令 功 能 at+cmgc send an sms command(发出一条短消息命令) at+cmgd delete sms message(删除sim卡内存的短消息) at+cmgf select sms message format(选择短消息信息格式:0-pdu;1-文本) at+cmgl list sms message from preferred store(列出sim卡中的短消息信息格式pdu/text:0/rec unread为未读,1/“rec read”为已读,2/“stou nsent”为待发,3/“sto sent”为已发,4/“all”为全部的) at+cmgr read sms message(读短消息) at+cmgs send sms message(发送短消息) at+cmgw write sms message to memory(向sim内存中写入待发的短消息) at+cmgs send sms message from storage(从sim内存中发送短消息) at+cnmi new sms message indication(显示新收到的短消息) at+cpms preferred sms message storage(选择短消息内存) at+csca sms service center address(短消息中心地址) at+cscb select cell broadcast message messages(选择蜂窝广播消息) at+csmp set sms text mode parameters(设置短消息文本模式参数) at+csmp select message service(选择短消息服务) 2. 4 pdu编码规则2. 4. 1 pdu编码格式目前,发送短消息常用text和pdu(protocol data unit,协议数据单元)模式。使用text模式收发短信代码简单,实现起来十分容易,但最大的缺点是不能收发中文短信;而pdu模式不仅支持中文短信,也能发送英文短信。pdu模式收发短信可以使用3种编码:7-bit、8-bit和ucs2编码。7-bit编码用于发送普通的ascii字符,8-bit编码通常用于发送数据消息,ucs2编码用于发送unicode字符。发送和接收sms信息有:blocd mod, text mod, 和 pdu mod三种方式,本设计是在pdu mode下发送和接收短信息的,所以首先要解决短信息的pdu编码和解码问题。pdu串表面上是一串ascii码,由09、af这些数字和字母组成。它们是8位字节的十六进制数,或者bcd码十进制数。pdu串不仅包含可显示的消息本身,还包含很多其他信息,如sms服务中心号码、目标号码、回复号码、编码方式和服务时间等。发送和接收的pdu串,结构是不完全相同的。一般的pdu编码由a b c d e f g h i j k l m十三项组成,具体如下:a:短信息中心地址长度,2位十六进制数(1字节)。b:短信息中心号码类型,2位十六进制数。c:短信息中心号码,b+c的长度将由a中的数据决定。d:文件头字节,2位十六进制数。e:信息类型,2位十六进制数。f:被叫号码长度,2位十六进制数。g:被叫号码类型,2位十六进制数,取值同b。h:被叫号码,长度由f中的数据决定。i:协议标识,2位十六进制数。j:数据编码方案,2位十六进制数。k:有效期,2位十六进制数。l:用户数据长度,2位十六进制数。m:用户数据,其长度由l中的数据决定。j中设定采用ucs2编码,这里是中英文的unicode字符。下面用两个实例说明pdu串的结构和编排方式:1)、发送:smsc号码是+8613800250500,对方号码消息内容是“hello!”。从手机发出的pdu串可以是:08 91 68 31 08 20 05 05 f0 11 00 0d 91 68 31 58 27 64 f8 00 00 00 06 c8 32 9b fd 0e 01 对照规范,以上数据信息的含义见表2:表2 发送pdu串结构 分段含义说明08smsc地址信息的长度共8个8位字节(包括91)91smsc地址格式(ton/npi)用国际格式号码(在前面加“+”)68 31 08 20 05 05 f0smsc地址8613800250500,补f凑成偶数个11基本参数(tp-mti/vfp)发送,tp-vp用相对格式分段含义说明00消息基准值(tp-mr)00d目标地址数字个数共13个十进制数(不包括91和f)91目标地址格式(ton/mpi)用国际格式号码(在前面加“+”)68 31 58 81 27 64 f8目标地址(tp-da)8613851872468,补f凑成偶数个00协议标识(tp-pid)是普通gsm类型,点到点方式00用户信息编码方式(tp-dcs)7-bit编码00有效期(tp-vp)5分钟06用户信息长度(tp-udl)实际长度6个字节c8 32 9b fd 0e 01用户信息(tp-ud)“hello!”2) 接收:smsc号码是:+8613800250500,对方号码消息内容是“你好!”。手机接收到的pdu串可以是:08 91 68 31 08 20 05 05 f0 84 0d 91 68 31 58 81 27 64 f8 00 08 30 30 21 80 63 54 80 06 4f 60 59 7d 00 21对照规范,pdu串数据信息说明如表3:表3 接收pdu串结构分段含义说明08地址信息的长度共8个8位字节(包括91)91smsc地址格式(ton/npi)用国际格式号码(在前面加“+”)68 31 08 20 05 05 f0smsc地址8613800250500,补f凑成偶数个84基本参数(tp-mti/mms/rp)接收,无更多消息,有回复地址0d源地址数字个数共13个十进制数(不包括91和f)91源地址格式(ton/mpi)用国际格式号码(在前面加“+”)68 31 58 81 27 64 f8源地址(tp-oa)8613851872468,补f凑成偶数个00协议标识(tp-pid)是普通gsm类型,点到点方式08用户信息编码方式(tp-dcs)ucs2编码30 30 21 80 63 54 80时间戳(tp-scts)2003-3-12 08:36:45 +8时区06用户信息长度(tp-udl)实际长度6个字节4f 60 59 7d 00 21用户信息(tp-ud)“你好!”2. 4. 2 pdu编解码实现函数由于在gsm标准中,中文编码采用的是unicode编码,而不是目前国内常用的gb-2312编码,故还需要进行中文编码的转换,才能显示汉字字型。1 ) 中文转换成unicode码函数因为手机短消息的发送是以pdu串的形式发送出去的,中文字符以unicode码来表示,所以在发送中文短消息之前必须首先将中文字符转换为unicode码,下面的函数将实现这个功能。这个函数主要应用到vb自带的一个格式转换函数:ascw()取ascii码值。public function ascii2unicode(byval cs as string)dim length as integerdim temp as stringdim i as integerdim tempo as stringdim tempn as stringtempn = tempo = cslength = len(tempo)for i = 1 to lengthif ascw(mid(cs, i, 1) = 0 and ascw(mid(cs, i, 1) 128 then temp = 00 & hex(ascw(mid(cs, i, 1)else temp = hex(ascw(mid(cs, i, 1)end iftempn = tempn & temp next i ascii2unicode = trim(tempn)end function2) 短信中心手机号码的pdu串转换函数同上,为了发送以pdu模式发送短消息,必须将手机号码和对方手机号也转换为pdu格式,下面的函数就是为了实现这种转换:public function telc(num as string) as stringdim tl as integerdim ltem, rtem, ttem as stringdim ti as integerttem = tl = len(num)if tl 11 and tl 13 then msgbox wrong number. & tl exit functionend ifif tl = 11 then tl = tl + 2 num = 86 & numend iffor ti = 1 to tl step 2 ltem = mid(num, ti, 1) rtem = mid(num, ti + 1, 1) if ti = tl then rtem = f ttem = ttem & rtem & ltemnext titelc = ttemend function手机号码有两种表示方法:11位和13位(带国家码86),一般手机发送时都是以13位形式表示的,所以以上的函数还有一个功能是自动将11位格式手机号码转换为13位形式,然后再转换为pdu串。3)unicode码解码函数相比于手机短信的发送而言,手机短信的接收主要的工作正好与之相反。手机短信的发送需要将待发送的短信内容转换为unicode码,而短信的接收则需要将接收到的unicode码转换成中文字符。下面的函数将实现解码功能。同手机短信发送的编码函数一样,这里也应用了一个vb内置的函数chrb()函数来将unicode码转换为中文:public function unicode2ascii(byval s as string)on error resume nextdim i as integerdim r as stringfor i = 1 to len(s) step 4r = r + chrb(&h & mid(s, i + 2, 2) & chrb(&h & mid(s, i, 2)nextunicode2ascii = rend function243 pdu模式短信息的发送过程要实现短信息的转发,编写出有效的发送程序,要先来了解短信息的发送原理及其过程。首先,设置短信息的发送模式,本设计采用的是pdu模式:输入:at+cmgf=0 回车系统会返回: ok然后发送短信息:假如,要向号码“发送内容为“你好!”这么一条短信息,那么,先要把目标号码”转换为“ 68 31 58 81 27 64 f8”,短信息内容转化为unicode码” 4f 60 59 7d 00 21”,然后再进行发送操作如下:输入:at+cmgs=021 回车当系统返回: 时,输入:0011000d91683158812764f8000801064f60597d0021返回: +cmgs: ok其中“at+cmgs=021”中的021是由tpdu中用户数据前的pdu规约头的长度15字节+用户数据长度6字节得到。3 系统软件设计流图系统软件主要分系统初始化、短信息发送、短信息读取和删除等功能模块。分别列出其程序设计流图,如图3、图4、图5和图6所示(具体的功能函数见附件),而读取sim卡中存储的电话号码则通过一个第三方组件taomodual.ocx来实现。开始初始化串口串口初始化成功?初始化模块信息初始化模块成功?等待准备发送状态提示信息编码设置编码模式输入对方号码和短信息内容按发送键发信息成功?打开串口?结束 图3 窗体初始化程序 图4 短信发送程序准备输入信息编号按读取键打开串口?设置编码模式成功读取信息?信息解码并显示读取状态显示结束输入信息编号按删除键送删除at指令删除状态提示结束准备成功删除信息?打开串口?送读取at指令 图5 读短信息程序 图6 删除短信息程序4 系统调试与总结1)在实际调试过程中,模块运行正常,性能稳定,实时性好。运行效果分别如图7、图8,图9所示:2)在开始调试过程中,也曾遇到了一个问题,如图10所示,信息发送状态报告总是出现错误的提示,但信息确实已经成功发送出去。经过一番的假设和调试后,最后认为问题出在gsm模块的返回值上,很多资料都说在信息成功发送后会最后返回ok字符,但经过多次的试调证明,信息成功发送出去后并没有ok字符串返回的,故将判断条件取反即解决了问题。图7端口设计状态图图8信息读取状态图图9 信息删除状态图图10 信息发送状态报告3)短信中心的号码可接使用sim卡中的号码,而不需要用户输入。有一条“at+csca”指令,可用于设置或查询服务中心号码。若sim卡中已存在此号码,有两种解决办法:一是用“at+csca?”指令查询出来,然后自动将此号码写到pdu的sca中;二是pdu的sca字段只写一个“00”:即“08 91 68 31 ”-“00”。4)可用“at+csca=xxxxxxxx”指令设置服务中心号码。5)在编写程序过程中需要注意到,为了防止手机因过于繁忙而出错,要采取一定的方法让手机有充分的时间处理发送和接收及删除等操作。而vb里自带的sleep()函数正是为此而设计的,设置不同参数值可改变其等待的时间,这样就可以避免因为手机过于繁忙而出现程序处理错误和系统死机等情况。6)由于设计系统模块需要提供+5v、+12v和-12v三路电源,在设计电源时,要注意把这三路电源的地线做成公共地线,即把它们的地线连通。7)在程序设计过程中,用到了mscomm32.ocx等内置组件,如果运行该应用程序的机器上没有这些组件,程序将无法正常运行,为了解决这一问题,可以通过把相关的程序和组件进行打包,从而形成程序安装包 。8)总结:本论文主要论述了个人计算机通过串口通信控制gsm模块进行短信息接收和发送的工作原理以及相应的程序设计过程,着重分析了gsm at指令及其用法和pdu编码解码的原理规则及相应的实现函数,还详细描述了pdu模式下短信息的发送过程和窗体初始化、短信息发送、短信息读取和删除等功能模块的程序流图。在整个设计工作过程中,从多方面学习了gsm模块收发短信息等基本功能的工作原理以及如何利用vb实现串口通信编程,掌握了pdu编码解码的原理和实现过程,并加深了计算机串口开发应用的认识。参考文献:1龚建伟, 熊光明. visual c+/turbo c 串口通信编程实践m. 北京:电子工业出版社,2004年。2求是科技. visual c+ visual basic 串并口开发技术工程应用实例导航m. 北京:人民邮电出版社,2006。3刘炳文. visual basic 程序设计教程(第二版)m. 北京:清华大学出版社,2003。4北京达盛科技有限公司. techshine(使用说明书 电子电气综合实训系统)m. 2627。system design of pcs serial port controlling gsm module to send and receive short messagesxiao linfaabstract:the sms(short message service) which has more and more been much accounted of the system developers and system operators is the value that a basic business of the gsm network. we can develop various applications that foreground is considerable using the gsm network as the network to transmit datas wireless . this text just discusses the programmer of that pcs serial port controls the gsm module to realize chinese or english short messages sending and receiving, which can realize measuer datas sending or receiving, memory and dealing on the personal computer through the gsm network. and bat around the message format of pdu mode and programmer of chinese messages coding and decoding.key words: short message service;pcs serial port;gsm module;at commands;pdu coding and decoding附:系统源程序-全局变量声明-dim portno as integer 端口号dim baudrate as long 波特率const prex = 0891 定义全局静态变量const midx = 0011000d91const sufx = 000801private const em_linescroll = &hb6-发送信息private declare function sendmessage lib user32 alias sendmessagea (byval hwnd as long, byval wmsg as long, byval wparam as long, lparam as any) as long-sleep函数(延时功能)private declare sub sleep lib kernel32 (byval dwmilliseconds as long)getwindowtextw 指明这是一个 unicode api (assiiunicode)private declare function getwindowtext lib user32 alias getwindowtextw (byval hwnd as long, byval lpstring as long, byval cch as long) as longtext2.text = strconv(strconv(text1.text, vbunicode), vbfromunicode)private sub newsmseting() 检测新信息 if mobcomm.portopen = false then mobcomm.portopen = true end if mobcomm.output = at+cnmi=1,1,0,0,1 + vbcr timer2.enabled = trueend subprivate function telc(num as string) as string 把电话号码转换成unicode码 dim tl as integer dim ltem, rtem, ttem as string dim ti as integer ttem = tl = len(num) if tl 11 and tl 13 then msgbox 电话号码有误! & tl exit function end if if tl = 11 then tl = tl + 2 num = 86 & num end if for ti = 1 to tl step 2 ltem = mid(num, ti, 1) rtem = mid(num, ti + 1, 1) if ti = tl then rtem = f ttem = ttem & rtem & ltem next ti telc = ttemend function将unicode转换中文public function unicode2ascii(byval s as string)on error resume nextdim i as integerdim r as stringfor i = 1 to len(s) step 4r = r + chrb(&h & mid(s, i + 2, 2) & chrb(&h & mid(s, i, 2)nextunicode2ascii = rend functionpublic function ascii2unicode(byval cs as string) 把信息转换成unicode码dim length as integerdim temp as stringdim i as integerdim tempo as stringdim tempn as stringtempn = tempo = cslength = len(tempo)for i = 1 to lengthif ascw(mid(cs, i, 1) = 0 and ascw(mid(cs, i, 1) 0 then backstring = mobcomm.input mobcomm.inbuffercount = 0 mobcomm.outbuffercount = 0 if instr(backstring, ok) then mobcomm.output = at+cmgs= + str(ml) + chr(13) + chr(10) else goto err exit sub end if backstring = end ifsleep (400)if mobcomm.inbuffercount 0 then backstring = mobcomm.input mobcomm.inbuffercount = 0 mobcomm.outbuffercount = 0 if instr(backstring, ) then mobcomm.output = ms + chr(26) else goto err exit sub end if backstring = end if sleep (2000)if mobcomm.inbuffercount 0 then backstring = mobcomm.input mobcomm.inbuffercount = 0 mobcomm.outbuffercount = 0 if instr(backstring, ok) then msgbox 信息发送成功!, vbokonly, 系统提示 else goto err exit function end if backstring = end ifsleep (1000)exit suberr: msgbox 信息发送成功!, vbokonly, 系统提示 msgbox 传送出现错误,请重新发送!, vbokonly, 系统提示end subprivate function sendsms(num as string, msg as string) as boolean 短信发送 dim pdu, psmsc, pnum, pmsg, buf as string dim leng as string dim length as integer length = len(msg) length = 2 * length leng = hex(length) if length 0 then mobcomm.inputlen = 0 buf = mobcomm.input if instr(buf, ) then mobcomm.output = pdu & chr$(26) buf = end if end if if mobcomm.inbuffercount 0 then mobcomm.inputlen = 0 buf = mobcomm.input if instr(buf, ok) then buf = sendsms = true end if end ifend functionprivate sub readsms(rnum as string) 接收信息 mobcomm.output = at+cmgf=1 + vbcr mobcomm.output = at+cmgr= & rnum + vbcrend subprivate sub command1_click() myactivex.active = false myactivex.comport = combo1(1).text myactivex.baudrate = int(val(combo2(1).text) msgbox 设置端口号为: & combo1(1).text & ,波特率为: & combo2(1).text & tl myactivex.active = true end subprivate sub command2_click()msg.text = end subprivate sub command3_click() debugtext = sim卡信息 = debugtext sim卡imsi: + myactivex.imsi debugtext 短信中心: + myactivex.sca debugtext 所属网络: + myactivex.provider debugtext 短信数目: + myactivex.smsmemused debugtext 短信容量: + myactivex.smsmemtotal debugtext 电话号码数: + myactivex.phonebookcount debugtext =end subprivate sub dm_click()dim instring as stringmyactivex.active = falseif mobcomm.portopen = false thenmobcomm.portopen = trueend ifmobcomm.inbuffercount = 0mobcomm.outbuffercount = 0mobcomm.inputlen = 0sleep (100)mobcomm.output = at+cmgf=1 + vbcrsleep (400)mobcomm.inbuffercount = 0mobcomm.output = at+cmgd= + index.text + chr(13) + chr(10)sleep (400)mobcomm.outbuffercount = 0mobcomm.output =+ vbcrif mobcomm.inbuffercount 0 theninstring = mobcomm.inputif instr(instring, ok) then msgbox 成功删除第 + index.text + 条信息!, vbokonly, 提示 else msgbox 信息删除不成功!end ifend ifrmsg.text = mid(instring.text, 1, instr(instring, chr(13) + chr(10)rmsg.text = unicode2ascii(stringdeal(instring)rmsg.text = mid(instring, 11)sleep (100)mobcomm.outbuffercount = 0mobcomm.output = text1.text + chr(26)sleep (100)end ifif instr(instring, ok) thenend ifif mobcomm.portopen = true then mobcomm.portopen = false end ifmyactivex.active = trueif mobcomm.portopen = false then mobcomm.portopen = trueend if mobcomm.output = at+cmgd= & index.text + vbcr sleep (300) if mobcomm.inbuffercount 0 then mobcomm.inputlen = 0 temp$ = mobco
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论