- 浏览: 290905 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
kane0409:
NB,解决了,我是把里面两个文件夹中的文件单独复制到eclip ...
解决initializing java tooling(1%) -
string2020:
那如果不采用Tomcat容器认证,怎么办?
Tomcat Session共享 -
hety163:
删除当前工作目录下的WORKSPACE/.metadata/. ...
解决initializing java tooling(1%) -
fox13754888170:
害的我好惨啊 每天工具不动弹 领导还以为我偷懒呢。。。。 ...
解决initializing java tooling(1%) -
ywc123zk:
十分感谢,myeclipse8.0也出现这种情况,用你的方法解 ...
解决initializing java tooling(1%)
概述
手机的短消息实现目前有三种方法:
1.通过移动网关发送短消息,使用该方法不需要附加的硬件,但是需要到电信部门申请网关,比较适用于一些大型的网络通讯公司开发,目前华为,中兴等公司就做的这方面的工作,并且还有相应的开发包供开发人员使用.
2.在电脑上通过GSM
MODEM向手机发送中文短消息,这是目前比较适合于小项目开发的一种方法,所需硬件包括一款手机,提供GSM
MODEM,以及相应的数据线或是红外线适配器.该方法编码简单,只需对AT指令和串口编程比较熟悉就可以实现,而且对硬件需求不高,并能自动收发短消息.
3.通过一些网站上提供的短信发送功能来实现,比如新浪网,网易都提供这方面的服务,这种方法是这三种方法中实现起来最简单,所需资源最少的,但是对于网站的依赖性太强,对网络的依赖同样无法避免,不适用于项目开发.
通过第二种方法收发短消息又分为三种模式:Block模式、Text模式和Pdu。使用Block机生产厂家提供驱动支持,现在还没有发现哪个厂家公布支持这种短信发送模式,而Pdu模式开发起来比较复杂,并且需要编写专门的函数来将文本转换为Pdu格式,比较繁琐.相对而言,应用Text模式开发及方便也简单,是一种不错的选择,不过使用Text模式开发只能发送ASCII码,对于中文的Unicode码不能发送.
使用Text模式发送短信其实很简单,只要对于AT指令有基本的了解,就能编写出短消息的发送程序,可是一直以来介绍该方法的文章却少之又少,很多人认为使用该方法太简单,不值一提.不过对于简单的应用来说,该方法也不失于一种不错的选择.
短信编码
在收发短信方面,按时间产生先后,共产生了三种模式:Block Mode、基于AT指令的Text Mode、基于AT指令的PDU Modem, Text Mode比较简单,多款诺基亚手机均支持该模式。西门子的手机大多只支持PDU模式,PDU模式是发送或接收手机SMS信息的一种方法,短信息正文经过十六进制编码后被传送。目前,PDU已取代Block Mode,因我们主要探讨PDU模式的发送。以西门子3508手机为例。
SMS是由Etsi所制定的一个规范(GSM 03.40 和 GSM 03.38)。当使用7-bits编码时,它可以发送最多160个字符;但用8-bit编码,最多可以发送140个字符,通常无法直接通过手机显示;还有用16-bit编码时,最多70个字符,被用来显示Unicode(UCS2)文本信息,可以被大多数的手机所显示。今天讨论的是UCS2编码,也就是说,最多只能发送70个字符,不管英文还是中文。
现例如我们现在要发送如下信息,向手机13715342642发送"你好,Hello!"。在没有发送之前,你要清楚,手机SIM卡所在地的短信中心号,并不是你现在所在地方的短信中心号,深圳的短信中心号是:8613800755000,即使到外地,短信中心号仍是深圳。从上面得到了下面的信息:
接收的手机号:13715342642
短信中心号:8613800755000
短信内容:你好,Hello!
在实际使用中,上面这些信息并不为手机所执行,要进行编码手机才会执行,先不管,看看编码后的信息:
0891683108705500F011000D91683117352446F2000800124F60597DFF0C00480065006C006C006F0021
解释一下:
08 - 指的是短信中心号的长度,也就是指(91)+( 683108705500F0)的长度
91 - 指的是短信息中心号码类型。91是TON/NPI遵守International/E.164标准,指在号码前需加'+'号;此外还有其它数值,但91最常用。
683108705500F0 - 短信息中心号码。由于位置上略有处理,实际号码应为:8613800731500(字母F是指长度减1)。这需要根据不同的地域作相应的修改。前面的(08)+(91)+( 683108705500F0)实际上就构成了整个短信的一部份,通称短消息中心地址(Address of the SMSC)。
11 - 文件头字节
00 - 信息类型(TP-Message-Reference)
0D - 被叫号码长度
91 - 被叫号码类型
其实在实际处理中,我们通常把11000D91写死在程序中,因为在国内,这些数据都是不会改变的。
683117352446F2 -被叫号码,经过了位移处理,实际号码为"8613715342642"。上面的(00)+(0D)+(91)+( 683117352446F2),构成了整个短信的第二部份目的地址(TP-Destination-Address)。
00 - 协议标识TP-PID,这里一般为00
08 - 数据编码方案TP-DCS(TP-Data-Coding-Scheme),采用前面说的USC2(16bit)数据编码
00 - 有效期TP-VP(TP-Valid-Period)
12-长度TP-UDL(TP-User-Data-Length),也就是4F60597DFF0C00480065006C006C的长度 36 / 2 = 18 的十六进 12
4F60597DFF0C00480065006C006C 006F0021- 这里就是短信内容了,实际内容为:"你好,Hello!"
AT指令
一、 一般命令
1、 AT+CGMI 给出模块厂商的标识。
2、 AT+CGMM 获得模块标识。这个命令用来得到支持的频带(GSM 900,DCS 1800 或PCS 1900)。当模块有多频带时,回应可能是不同频带的结合。
3、 AT+CGMR 获得改订的软件版本。
4、 AT+CGSN 获得GSM模块的IMEI(国际移动设备标识)序列号。
5、 AT+CSCS 选择TE特征设定。这个命令报告TE用的是哪个状态设定上的ME。ME于是可以转换每一个输入的或显示的字母。这个是用来发送、读取或者撰写短信。
6、 AT+WPCS 设定电话簿状态。这个特殊的命令报告通过TE电话簿所用的状态的ME。ME于是可以转换每一个输入的或者显示的字符串字母。这个用来读或者写电话簿的入口。
7、 AT+CIMI 获得IMSI。这命令用来读取或者识别SIM卡的IMSI(国际移动签署者标识)。在读取IMSI之前应该先输入PIN(如果需要PIN的话)。
8、 AT+CCID 获得SIM卡的标识。这个命令使模块读取SIM卡上的EF-CCID文件。
9、 AT+GCAP 获得能力表。(支持的功能)
10、 A/ 重复上次命令。只有A/命令不能重复。这命令重复前一个执行的命令。
11、 AT+CPOF 关机。这个特殊的命令停止GSM软件堆栈和硬件层。命令AT+CFUN=0的功能与+CPOF相同。
12、 AT+CFUN 设定电话机能。这个命令选择移动站点的机能水平。
13、 AT+CPAS 返回移动设备的活动状态。
14、 AT+CMEE 报告移动设备的错误。这个命令决定允许或不允许用结果码“+CME ERROR:<xxx>”或者“+CMS ERROR:<xxx>”代替简单的“ERROR”。
15、 AT+CKPD 小键盘控制。仿真ME小键盘执行命令。
16、 AT+CCLK 时钟管理。这个命令用来设置或者获得ME真实时钟的当前日期和时间。
17、 AT+CALA 警报管理。这个命令用来设定在ME中的警报日期/时间。(闹铃)
18、 AT+CRMP 铃声旋律播放。这个命令在模块的蜂鸣器上播放一段旋律。有两种旋律可用:到来语音、数据或传真呼叫旋律和到来短信声音。
19、 AT+CRSL 设定或获得到来的电话铃声的声音级别。
二、 呼叫控制命令
1、 ATD 拨号命令。这个命令用来设置通话、数据或传真呼叫。
2、 ATH 挂机命令。
3、 ATA 接电话。
4、 AT+CEER 扩展错误报告。这个命令给出当上一次通话设置失败后中断通话的原因。
5、 AT+VTD 给用户提供应用GSM网络发送DTMF(双音多频)双音频。这个命令用来定义双音频的长度(默认值是300毫秒)。
6、 AT+VTS 给用户提供应用GSM网络发送DTMF双音频。这个命令允许传送双音频。
7、 ATDL 重拨上次电话号码。
8、 AT%Dn 数据终端就绪(DTR)时自动拨号。
9、 ATS0 自动应答。
10、 AT+CICB 来电信差。
11、 AT+CSNS 单一编号方案。
12、 AT+VGR,AT+VGT 增益控制。这个命令应用于调节喇叭的接收增益和麦克风的传输增益。
13、 AT+CMUT 麦克风静音控制。
14、 AT+SPEAKER 喇叭/麦克风选择。这个特殊命令用来选择喇叭和麦克风。
15、 AT+ECHO 回音取消。
16、 AT+SIDET 侧音修正。
17、 AT+VIP 初始化声音参数。
18、 AT+DUI 用附加的用户信息拨号。
19、 AT+HUI 用附加的用户信息挂机。
20、 AT+RUI 接收附加用户信息。
三、 网络服务命令
1、 AT+CSQ 信号质量。
2、 AT+COPS 服务商选择。
3、 AT+CREG 网络注册。获得手机的注册状态。
4、 AT+WOPN 读取操作员名字。
5、 AT+CPOL 优先操作员列表。
四、 安全命令
1、 AT+CPIN 输入PIN。
2、 AT+CPIN2 输入PIN2。
3、 AT+CPINC PIN的剩余的尝试号码。
4、 AT+CLCK 设备锁。
5、 AT+CPWD 改变密码。
五、 电话簿命令
1、 AT+CPBS 选择电话簿记忆存储。
2、 AT+CPBR 读取电话簿表目。
3、 AT+CPBF 查找电话簿表目。
4、 AT+CPBW 写电话簿表目。
5、 AT+CPBP 电话簿电话查询。
6、 AT+CPBN 电话簿移动动作。这个特殊命令使电话簿中的条目前移或后移(按字母顺序)
7、 AT+CNUM 签署者号码。
8、 AT+WAIP 防止在下一次重起时初始化所有的电话簿。
9、 AT+WDCP 删除呼叫电话号码。
10、 AT+CSVM 设置语音邮件号码。
六、 短消息命令
1、 AT+CSMS 选择消息服务。支持的服务有GSM-MO、SMS-MT、SMS-CB。
2、 AT+CNMA 新信息确认应答。
3、 AT+CPMS 优先信息存储。这个命令定义用来读写信息的存储区域。
4、 AT+CMGF 优先信息格式。执行格式有TEXT方式和PDU方式。
5、 AT+CSAS 保存设置。保存+CSAS和+CSMP的参数。
6、 AT+CRES 恢复设置。
7、 AT+CSDH 显示文本方式的参数。
8、 AT+CNMI 新信息指示。这个命令选择如何从网络上接收短信息。
9、 AT+CMGR 读短信。信息从+CPMS命令设定的存储器读取。
10、 AT+CMGL 列出存储的信息。
11、 AT+CMGS 发送信息。
12、 AT+CMGW 写短信息并存储。
13、 AT+CMSS 从存储器中发送信息。
14、 AT+CSMP 设置文本模式的参数。
15、 AT+CMGD 删除短信息。删除一个或多个短信息。
16、 AT+CSCA 短信服务中心地址。
17、 AT+CSCB 选择单元广播信息类型。
18、 AT+WCBM 单元广播信息标识。
19、 AT+WMSC 信息状态(是否读过、是否发送等等)修正。
20、 AT+WMGO 信息覆盖写入。
21、 AT+WUSS 不改变SMS状态。在执行+CMGR或+CMGL后仍保持UNREAD。
七、 追加服务命令
1、 AT+CCFC 呼叫继续。
2、 AT+CLCK 呼叫禁止。
3、 AT+CPWD 改变追加服务密码。
4、 AT+CCWA 呼叫等待。
5、 AT+CLIR 呼叫线确认限制。
6、 AT+CLIP 呼叫线确认陈述。
7、 AT+COLP 联络线确认陈述。
8、 AT+CAOC 费用报告。
9、 AT+CACM 累计呼叫计量。
10、 AT+CAMM 累计呼叫计量最大值。
11、 AT+CPUC 单价和货币表。
12、 AT+CHLD 呼叫相关的追加服务。
13、 AT+CLCC 列出当前的呼叫。
14、 AT+CSSN 追加服务通知。
15、 AT+CUSD 无组织的追加服务数据。
16、 AT+CCUG 关闭的用户组。
八、 数据命令
1、 AT+CBST 信差类型选择。
2、 AT+FCLASS 选择模式。这个命令把模块设置成数据或传真操作的特殊模式。
3、 AT+CR 服务报告控制。这个命令允许更为详细的服务报告。
4、 AT+CRC 划分的结果代码。这个命令在呼叫到来时允许更为详细的铃声指示。
5、 AT+ILRR 本地DTE-DCE速率报告。
6、 AT+CRLP 无线电通信线路协议参数。
7、 AT+DOPT 其他无线电通信线路参数。
8、 AT%C 数据压缩选择。
9、 AT+DS 是否允许V42二度数据压缩。
10、 AT+DR 是否报告V42二度数据压缩。
11、 AT\N 数据纠错选择。
九、 传真命令
1、 AT+FTM 传送速率。
2、 AT+FRM 接收速率
3、 AT+FTH 用HDLC协议设置传真传送速率。
4、 AT+FRH 用HDLC协议设置传真接收速率。
5、 AT+FTS 停止特定时期的传送并等待。
6、 AT+FRS 接收沉默。
十、 第二类传真命令
1、 AT+FDT 传送数据。
2、 AT+FDR 接收数据。
3、 AT+FET 传送页标点。
4、 AT+FPTS 页转换状态参数。
5、 AT+FK 终止会议。
6、 AT+FBOR 页转换字节顺序。
7、 AT+FBUF 缓冲大小报告。
8、 AT+FCQ 控制拷贝质量检验。
9、 AT+FCR 控制接收传真的能力。
10、 AT+FDIS 当前会议参数。
11、 AT+FDCC 设置DCE功能参数。
12、 AT+FLID 定义本地ID串。
13、 AT+FPHCTO 页转换超时参数。
十一、V24-V25命令
1、 AT+IPR 确定DTE速率。
2、 AT+ICF 确定DTE-DCE特征结构。
3、 AT+IFC 控制DTE-DCE本地流量。
4、 AT&C 设置DCD(数据携带检测)信号。
5、 AT&D 设置DTR(数据终端就绪)信号。
6、 AT&S 设置DST(数据设置就绪)信号。
7、 ATO 回到联机模式。
8、 ATQ 决定手机是否发送结果代码。
9、 ATV 决定DCE响应格式。
10、 ATZ 恢复为缺省设置。
11、 AT&W 保存设置。
12、 AT&T 自动测试。
13、 ATE 决定是否回显字符。
14、 AT&F 回到出厂时的设定。
15、 AT&V 显示模块设置情况。
16、 ATI 要求确认信息。这命令使GSM模块传送一行或多行特定的信息文字。
17、 AT+WMUX 数据/命令多路复用。
十二、特殊AT命令
1、 AT+CCED 电池环境描述。
2、 AT+CCED 自动RxLev指示。
3、 AT+WIND 一般指示。
4、 AT+ALEA 在ME和MSC之间的数据密码模式。
5、 AT+CRYPT 数据密码模式。
6、 AT+EXPKEY 键管理。
7、 AT+CPLMN 在PLMN上的信息。
8、 AT+ADC 模拟数字转换度量。
9、 AT+CMER 移动设备事件报告。这个命令决定是否允许在键按下时是否主动发送结果代码。
10、 AT+WLPR 读取语言偏好。
11、 AT+WLPW 写语言偏好。
12、 AT+WIOR 读取GPIO值。
13、 AT+WIOW 写GPIO值。
14、 AT+WIOM 输入/输出管理。
15、 AT+WAC 忽略命令。这个特殊命令允许忽略SMS、SS和可用的PLMN。
16、 AT+WTONE 播放旋律。
17、 AT+WDTMF 播放DTMF旋律。
18、 AT+WDWL 下载模式。
19、 AT+WVR 配置信差的声音速率。
20、 AT+WDR 配置数据速率。
21、 AT+WHWV 显示硬件的版本。
22、 AT+WDOP 显示产品的出厂日期。
23、 AT+WSVG 声音增益选择。
24、 AT+WSTR 返回指定状态的状态。
25、 AT+WSCAN 扫描。
26、 AT+WRIM 设置或返回铃声指示模式。
27、 AT+W32K 是否允许32kHz掉电方式。
28、 AT+WCDM 改变缺省旋律。
29、 AT+WSSW 显示内部软件版本。
30、 AT+WCCS 编辑或显示订制性质设置表。
31、 AT+WLCK 允许在特定的操作符上个性化ME。
32、 AT+CPHS 设置CPHS命令。
33、 AT+WBCM 电池充电管理。
34、 AT+WFM 特性管理。是否允许模块的某些特性,如带宽模式、SIM卡电压等。
35、 AT+WCFM 商业特性管理。是否允许Wavecom特殊特性。
36、 AT+WMIR 允许从当前存储的参数值创建定制的存储镜像。
37、 AT+WCDP 改变旋律的缺省播放器。
38、 AT+WMBN 设置SIM卡中的不同邮箱号码。
十三、SIM卡工具箱命令
1、 AT+STSF 配置工具箱实用程序。
2、 AT+STIN 工具箱指示。
3、 AT+STGI 获得从SIM卡发来的预期命令的信息。
4、 AT+STCR 主动提供的结果:工具箱控制反应。
5、 AT+STGR 给出响应。允许程序或用户从主菜单上选择项目,或响应某些命令
常用的与SMS有关的GSM AT指令(GSM07.05)如表1所示:
AT 指令
功 能
AT+CMGC
Send an SMS command(发出一条短消息命令)
AT+CMGD
Delete SMS message(删除SIM卡内存的短消息)
AT+CMGF
Select SMS message formate(选择短消息信息格式:0-PDU;1-文本)
AT+CMGL
List SMS message from preferred store(列出SIM卡中的短消息PDU/text: 0/"REC UNREAD"-未读,1/"REC READ"-已读,2/"STO UNSENT"-待发,3/"STO SENT"-已发,4/"ALL"-全部的)
AT+CMGR
Read SMS message(读短消息)
AT+CMGS
Send SMS message(发送短消息)
AT+CMGW
Write SMS message to memory(向SIM内存中写入待发的短消息)
AT+CMSS
Send SMS message from storage(从SIN|M内存中发送短消息)
AT+CNMI
New SMS message indications(显示新收到的短消息)
AT+CPMS
Preferred SMS message storage(选择短消息内存)
AT+CSCA
SMS service center address(短消息中心地址)
AT+CSCB
Select cell broadcast messages(选择蜂窝广播消息)
AT+CSMP
Set SMS text mode parameters(设置短消息文本模式参数)
AT+CSMS
Select Message Service(选择短消息服务)
以实例来说明这些指令的使用方法:
先用手机数据线将手机连接到电脑串口,并将串口的波特率设置为19200,可以开始了。
1、首先测试你的连接及手机是否支持AT指令,请在你的串口调试程序中输入:
AT<回车>
屏幕上返回"OK"表明计算机与手机连接正常,那样我们就可以进行其它的AT指令测试了
2、设置短信发送格式
AT+CMGF=1<回车>
屏幕上返回"OK"表明现在短信的发送方式为PDU方式,如果是设置为TEXT方式,则,AT+CMGF=0<回车>
3、 发送短信
发送内容及手要号仍旧同上面在编码中的一样,编码后,得到要发送的数据如下
0891683108705505F011000D91683117352446F2000800124F60597D002C00480065006C006C006F0021
我们用如下指令来发送
AT+CMGS=33<回车>
如果返回">",就把上面编码数据输入,并以CTRL+Z结尾,稍等一下,你就可以看到返回OK啦。
说明一下,为什么AT+CMGS=33呢,是这样得来的:
11000D91683117352446F2000800124F60597D002C00480065006C006C006F0021
这一段字符串的长度除以2得到的结果,上面的字符串,短信中心号加上短信内容得到的,怎么得到的,请回顾一下解码部份
在我们前面的讨论中,一条完整的短信发送,只要执行三条AT指令,AT、AT+CMGS=?、AT+CMGS=?就可以了。由于篇幅,我只能在这里提到这么多,大家要是想了解更多,可以向各手机厂商索取AT指令白皮书,里面很详细的。
串口通信
C#实现
通常,在C#中实现串口通信,我们有四种方法:
第一:通过MSCOMM控件这是最简单的,最方便的方法。可功能上很难做到控制自如,同时这个控件并不是系统本身所带,所以还得注册,不在本文讨论范围。可以访问http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=320
第二:微软在.NET新推出了一个串口控件,基于.NET的P/Invoke调用方法实现,详细的大家可以访问微软网站http://msdn.microsoft.com/msdnmag/issues/02/10/NETSerialComm/default.aspx,方便得到更多资料。
第三:就是用第三方控件
第四:自己用API写串口通信
Vc++用API调用串口非多线程
一、设置串口相关工作
#define MAXBLOCK 2048
#define XON 0x11
#define XOFF 0x13
BOOL SetCom(HANDLE &m_hCom, const char *m_sPort, int
BaudRate, int Databit, CString parity, CString stopbit)
{
COMMTIMEOUTS TimeOuts; ///串口输出时间 超时设置
DCB dcb; ///与端口匹配的设备
m_hCom=CreateFile(m_sPort, GENERIC_READ |
GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL |
FILE_FLAG_OVERLAPPED,
NULL); // 以重叠方式打开串口
if(m_hCom==INVALID_HANDLE_VALUE)
{
AfxMessageBox("设置串口部分,串口打开失败"); /////重叠方式
异步通信(INVALID_HANDLE_VALUE)函数失败。
return FALSE;
}
SetupComm(m_hCom,MAXBLOCK,MAXBLOCK); //设置缓冲区
memset(&TimeOuts,0,sizeof(TimeOuts));
TimeOuts.ReadIntervalTimeout=MAXDWORD; //
把间隔超时设为最大,把总超时设为0将导致ReadFile立即返回并完成操作
TimeOuts.ReadTotalTimeoutMultiplier=0; //读时间系数
TimeOuts.ReadTotalTimeoutConstant=0; //读时间常量
TimeOuts.WriteTotalTimeoutMultiplier=50;
//总超时=时间系数*要求读/写的字符数+时间常量
TimeOuts.WriteTotalTimeoutConstant=2000;
//设置写超时以指定WriteComm成员函数中的
SetCommTimeouts(m_hCom, &TimeOuts);
//GetOverlappedResult函数的等待时间*/
if(!GetCommState(m_hCom, &dcb))
////串口打开方式、端口、波特率 与端口匹配的设备
{
AfxMessageBox("GetCommState Failed");
return FALSE;
}
dcb.fParity=TRUE; //允许奇偶校验
dcb.fBinary=TRUE;
if(parity=="NONE")
dcb.Parity=NOPARITY;
if(parity=="ODD")
dcb.Parity=ODDPARITY;
if(parity=="EVEN")
dcb.Parity=EVENPARITY;
if(stopbit=="1")//设置波特率
dcb.StopBits=ONESTOPBIT;
//if(stopbit=="0")//设置波特率
// dcb.StopBits=NONESTOPBIT;
if(stopbit=="2")//设置波特率
dcb.StopBits=TWOSTOPBITS;
BOOL m_bEcho=FALSE; ///
int m_nFlowCtrl=0;
BOOL m_bNewLine=FALSE; ///
dcb.BaudRate=BaudRate; // 波特率
dcb.ByteSize=Databit; // 每字节位数
// 硬件流控制设置
dcb.fOutxCtsFlow=m_nFlowCtrl==1;
dcb.fRtsControl=m_nFlowCtrl==1
?RTS_CONTROL_HANDSHAKE:RTS_CONTROL_ENABLE;
// XON/XOFF流控制设置(软件流控制!)
dcb.fInX=dcb.fOutX=m_nFlowCtrl==2;
dcb.XonChar=XON;
dcb.XoffChar=XOFF;
dcb.XonLim=50;
dcb.XoffLim=50;
if(SetCommState(m_hCom, &dcb))
return TRUE; ////com的通讯口设置
else
{
AfxMessageBox("串口已打开,设置失败");
return FALSE;
}
}
二、读串口操作:
int ReadCom(HANDLE hComm, BYTE inbuff[], DWORD
&nBytesRead, int ReadTime)
{
DWORD lrc; ///纵向冗余校验
DWORD endtime; /////////jiesuo
static OVERLAPPED ol;
int ReadNumber=0;
int numCount=0 ; //控制读取的数目
DWORD dwErrorMask,nToRead;
COMSTAT comstat;
ol.Offset=0; ///相对文件开始的字节偏移量
ol.OffsetHigh=0;
///开始传送数据的字节偏移量的高位字,管道和通信时调用进程可忽略。
ol.hEvent=NULL; ///标识事件,数据传送完成时设为信号状态
ol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
endtime=GetTickCount()+ReadTime;//GetTickCount()取回系统开始至此所用的时间(毫秒)
for(int i=0;i<2000;i++)
inbuff[i]=0;
Sleep(ReadTime);
ClearCommError(hComm,&dwErrorMask,&comstat);
nToRead=min(2000,comstat.cbInQue);
if(int(nToRead)<2)
goto Loop;
if(!ReadFile(hComm,inbuff,nToRead,&nBytesRead,&ol))
{
if((lrc=GetLastError())==ERROR_IO_PENDING)
{
///////////////////
endtime=GetTickCount()+ReadTime;//GetTickCount()取回系统开始至此所用的时间(毫秒)
while(!GetOverlappedResult(hComm,&ol,&nBytesRead,FALSE))//该函数取回重叠操作的结果
{
if(GetTickCount()>endtime)
break;
}
}
}
return 1;
Loop: return 0;
}
三、写串口命令
int WriteCom(HANDLE hComm, BYTE Outbuff[], int size, int
bWrite[])
{
DWORD nBytesWrite,endtime,lrc;
static OVERLAPPED ol;
DWORD dwErrorMask,dwError;
COMSTAT comstat;
ol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
ol.Offset=0;
ol.OffsetHigh=0;
ol.hEvent=NULL; ///标识事件,数据传送完成时,将它设为信号状态
ClearCommError(hComm,&dwErrorMask,&comstat);
if(!WriteFile(hComm,Outbuff,size,&nBytesWrite,&ol))
{
if((lrc=GetLastError())==ERROR_IO_PENDING)
{
endtime=GetTickCount()+1000;
while(!GetOverlappedResult(hComm,&ol,&nBytesWrite,FALSE))
{
dwError=GetLastError();
if(GetTickCount()>endtime)
{
AfxMessageBox("写串口时间过长,目前串口发送缓冲区中的数据数目为空");
break;
}
if(dwError=ERROR_IO_INCOMPLETE)
continue; //未完全读完时的正常返回结果
else
{
// 发生错误,尝试恢复!
ClearCommError(hComm,&dwError,&comstat);
break;
}
}
}
}
FlushFileBuffers(hComm);
PurgeComm(hComm,PURGE_TXCLEAR);
bWrite=0;
return 1;
}
四、调用方法很简单,只需要将你的串口参数进行简单的设置就可以了。比如:
BOOL OpenCom()//设置COM
{
int Boundrate=9600;//波特率
CString StopBits="1";//停止位
int DataBits=8;//数据位
CString Parity="ODD";//奇偶校验
CString m_Port="COM1";
Return SetCom(m_hCom1,m_Port,Boundrate,DataBits,Parity,StopBits);
}
void Main()
{
int SIZE;
DWORD BytestoRead=52*Count+6;//要11个字节
int BWRITE[2];
int ReadTime=2000;
BYTE Outbuff[12]={0xff,0x00,0xea,0xff,0xea,0xff,0,0,0,0,0,0};
SIZE=sizeof(Outbuff);
WriteCom(m_hCom,Outbuff,SIZE,BWRITE);
ReadCom(m_hCom,m_Inbuff,BytestoRead,ReadTime);
//进行相应的解包处理
}
简单的Vb使用TEXT模式
使用Text模式发送短信其实很简单,对于简单的应用来说,该方法也不失于一种不错的选择.
先在项目中添加Mscomm控件,一般的部件栏中可能没有列出Mscomm控件,可以过右击部件栏,选择”部件”,或是通过在菜单中的”工程”选择”部件”,然后选中Microsoft
Comm Control 6.0即可.添加了Mscomm控件后,可以设置一些基本的参数.如果你使用Nokia的手机,你还必须安装data
suite(可以到Nokia的开发论坛上去下载一个),然后Mscomm的commport选择3;如果你使用其他手机,采用红外线接口,你必须安装红外线驱动程序.选择相应的端口.下面的代码是一些基本参数的设置:
Mscomm1.Settings=”9600,N,8,1” ‘9600波特,无奇偶校验,8位数据,一个停止位
Mscomm1.InputLen=0 ‘读入整个缓冲区
Mscomm1.Portopen=True ‘打开端口
发送短消息的代码如下:
MSComm1.Output = "AT+CMGF=1" + vbCr ‘设置发送的模式,注意:一定要加上
vbCr
MSComm1.Output = "AT+CSCA=" & Chr$(34) & "8613010341500" &
Chr$(34) & ",129" + vbCr ‘8613010341500是短消息中心,各地的号码不一样,必须设置当地的短消息号码
MSComm1.Output = "AT+CMGS=" & Chr$(34) & "13057575064" &
Chr$(34) & ",129" + vbCr ‘13057575064是对方手机号
MSComm1.Output = "test" & Chr$(26) ‘chr$(26)是Ctr+ Z
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/qianbo_0423/archive/2006/02/17/601029.aspx
手机的短消息实现目前有三种方法:
1.通过移动网关发送短消息,使用该方法不需要附加的硬件,但是需要到电信部门申请网关,比较适用于一些大型的网络通讯公司开发,目前华为,中兴等公司就做的这方面的工作,并且还有相应的开发包供开发人员使用.
2.在电脑上通过GSM
MODEM向手机发送中文短消息,这是目前比较适合于小项目开发的一种方法,所需硬件包括一款手机,提供GSM
MODEM,以及相应的数据线或是红外线适配器.该方法编码简单,只需对AT指令和串口编程比较熟悉就可以实现,而且对硬件需求不高,并能自动收发短消息.
3.通过一些网站上提供的短信发送功能来实现,比如新浪网,网易都提供这方面的服务,这种方法是这三种方法中实现起来最简单,所需资源最少的,但是对于网站的依赖性太强,对网络的依赖同样无法避免,不适用于项目开发.
通过第二种方法收发短消息又分为三种模式:Block模式、Text模式和Pdu。使用Block机生产厂家提供驱动支持,现在还没有发现哪个厂家公布支持这种短信发送模式,而Pdu模式开发起来比较复杂,并且需要编写专门的函数来将文本转换为Pdu格式,比较繁琐.相对而言,应用Text模式开发及方便也简单,是一种不错的选择,不过使用Text模式开发只能发送ASCII码,对于中文的Unicode码不能发送.
使用Text模式发送短信其实很简单,只要对于AT指令有基本的了解,就能编写出短消息的发送程序,可是一直以来介绍该方法的文章却少之又少,很多人认为使用该方法太简单,不值一提.不过对于简单的应用来说,该方法也不失于一种不错的选择.
短信编码
在收发短信方面,按时间产生先后,共产生了三种模式:Block Mode、基于AT指令的Text Mode、基于AT指令的PDU Modem, Text Mode比较简单,多款诺基亚手机均支持该模式。西门子的手机大多只支持PDU模式,PDU模式是发送或接收手机SMS信息的一种方法,短信息正文经过十六进制编码后被传送。目前,PDU已取代Block Mode,因我们主要探讨PDU模式的发送。以西门子3508手机为例。
SMS是由Etsi所制定的一个规范(GSM 03.40 和 GSM 03.38)。当使用7-bits编码时,它可以发送最多160个字符;但用8-bit编码,最多可以发送140个字符,通常无法直接通过手机显示;还有用16-bit编码时,最多70个字符,被用来显示Unicode(UCS2)文本信息,可以被大多数的手机所显示。今天讨论的是UCS2编码,也就是说,最多只能发送70个字符,不管英文还是中文。
现例如我们现在要发送如下信息,向手机13715342642发送"你好,Hello!"。在没有发送之前,你要清楚,手机SIM卡所在地的短信中心号,并不是你现在所在地方的短信中心号,深圳的短信中心号是:8613800755000,即使到外地,短信中心号仍是深圳。从上面得到了下面的信息:
接收的手机号:13715342642
短信中心号:8613800755000
短信内容:你好,Hello!
在实际使用中,上面这些信息并不为手机所执行,要进行编码手机才会执行,先不管,看看编码后的信息:
0891683108705500F011000D91683117352446F2000800124F60597DFF0C00480065006C006C006F0021
解释一下:
08 - 指的是短信中心号的长度,也就是指(91)+( 683108705500F0)的长度
91 - 指的是短信息中心号码类型。91是TON/NPI遵守International/E.164标准,指在号码前需加'+'号;此外还有其它数值,但91最常用。
683108705500F0 - 短信息中心号码。由于位置上略有处理,实际号码应为:8613800731500(字母F是指长度减1)。这需要根据不同的地域作相应的修改。前面的(08)+(91)+( 683108705500F0)实际上就构成了整个短信的一部份,通称短消息中心地址(Address of the SMSC)。
11 - 文件头字节
00 - 信息类型(TP-Message-Reference)
0D - 被叫号码长度
91 - 被叫号码类型
其实在实际处理中,我们通常把11000D91写死在程序中,因为在国内,这些数据都是不会改变的。
683117352446F2 -被叫号码,经过了位移处理,实际号码为"8613715342642"。上面的(00)+(0D)+(91)+( 683117352446F2),构成了整个短信的第二部份目的地址(TP-Destination-Address)。
00 - 协议标识TP-PID,这里一般为00
08 - 数据编码方案TP-DCS(TP-Data-Coding-Scheme),采用前面说的USC2(16bit)数据编码
00 - 有效期TP-VP(TP-Valid-Period)
12-长度TP-UDL(TP-User-Data-Length),也就是4F60597DFF0C00480065006C006C的长度 36 / 2 = 18 的十六进 12
4F60597DFF0C00480065006C006C 006F0021- 这里就是短信内容了,实际内容为:"你好,Hello!"
AT指令
一、 一般命令
1、 AT+CGMI 给出模块厂商的标识。
2、 AT+CGMM 获得模块标识。这个命令用来得到支持的频带(GSM 900,DCS 1800 或PCS 1900)。当模块有多频带时,回应可能是不同频带的结合。
3、 AT+CGMR 获得改订的软件版本。
4、 AT+CGSN 获得GSM模块的IMEI(国际移动设备标识)序列号。
5、 AT+CSCS 选择TE特征设定。这个命令报告TE用的是哪个状态设定上的ME。ME于是可以转换每一个输入的或显示的字母。这个是用来发送、读取或者撰写短信。
6、 AT+WPCS 设定电话簿状态。这个特殊的命令报告通过TE电话簿所用的状态的ME。ME于是可以转换每一个输入的或者显示的字符串字母。这个用来读或者写电话簿的入口。
7、 AT+CIMI 获得IMSI。这命令用来读取或者识别SIM卡的IMSI(国际移动签署者标识)。在读取IMSI之前应该先输入PIN(如果需要PIN的话)。
8、 AT+CCID 获得SIM卡的标识。这个命令使模块读取SIM卡上的EF-CCID文件。
9、 AT+GCAP 获得能力表。(支持的功能)
10、 A/ 重复上次命令。只有A/命令不能重复。这命令重复前一个执行的命令。
11、 AT+CPOF 关机。这个特殊的命令停止GSM软件堆栈和硬件层。命令AT+CFUN=0的功能与+CPOF相同。
12、 AT+CFUN 设定电话机能。这个命令选择移动站点的机能水平。
13、 AT+CPAS 返回移动设备的活动状态。
14、 AT+CMEE 报告移动设备的错误。这个命令决定允许或不允许用结果码“+CME ERROR:<xxx>”或者“+CMS ERROR:<xxx>”代替简单的“ERROR”。
15、 AT+CKPD 小键盘控制。仿真ME小键盘执行命令。
16、 AT+CCLK 时钟管理。这个命令用来设置或者获得ME真实时钟的当前日期和时间。
17、 AT+CALA 警报管理。这个命令用来设定在ME中的警报日期/时间。(闹铃)
18、 AT+CRMP 铃声旋律播放。这个命令在模块的蜂鸣器上播放一段旋律。有两种旋律可用:到来语音、数据或传真呼叫旋律和到来短信声音。
19、 AT+CRSL 设定或获得到来的电话铃声的声音级别。
二、 呼叫控制命令
1、 ATD 拨号命令。这个命令用来设置通话、数据或传真呼叫。
2、 ATH 挂机命令。
3、 ATA 接电话。
4、 AT+CEER 扩展错误报告。这个命令给出当上一次通话设置失败后中断通话的原因。
5、 AT+VTD 给用户提供应用GSM网络发送DTMF(双音多频)双音频。这个命令用来定义双音频的长度(默认值是300毫秒)。
6、 AT+VTS 给用户提供应用GSM网络发送DTMF双音频。这个命令允许传送双音频。
7、 ATDL 重拨上次电话号码。
8、 AT%Dn 数据终端就绪(DTR)时自动拨号。
9、 ATS0 自动应答。
10、 AT+CICB 来电信差。
11、 AT+CSNS 单一编号方案。
12、 AT+VGR,AT+VGT 增益控制。这个命令应用于调节喇叭的接收增益和麦克风的传输增益。
13、 AT+CMUT 麦克风静音控制。
14、 AT+SPEAKER 喇叭/麦克风选择。这个特殊命令用来选择喇叭和麦克风。
15、 AT+ECHO 回音取消。
16、 AT+SIDET 侧音修正。
17、 AT+VIP 初始化声音参数。
18、 AT+DUI 用附加的用户信息拨号。
19、 AT+HUI 用附加的用户信息挂机。
20、 AT+RUI 接收附加用户信息。
三、 网络服务命令
1、 AT+CSQ 信号质量。
2、 AT+COPS 服务商选择。
3、 AT+CREG 网络注册。获得手机的注册状态。
4、 AT+WOPN 读取操作员名字。
5、 AT+CPOL 优先操作员列表。
四、 安全命令
1、 AT+CPIN 输入PIN。
2、 AT+CPIN2 输入PIN2。
3、 AT+CPINC PIN的剩余的尝试号码。
4、 AT+CLCK 设备锁。
5、 AT+CPWD 改变密码。
五、 电话簿命令
1、 AT+CPBS 选择电话簿记忆存储。
2、 AT+CPBR 读取电话簿表目。
3、 AT+CPBF 查找电话簿表目。
4、 AT+CPBW 写电话簿表目。
5、 AT+CPBP 电话簿电话查询。
6、 AT+CPBN 电话簿移动动作。这个特殊命令使电话簿中的条目前移或后移(按字母顺序)
7、 AT+CNUM 签署者号码。
8、 AT+WAIP 防止在下一次重起时初始化所有的电话簿。
9、 AT+WDCP 删除呼叫电话号码。
10、 AT+CSVM 设置语音邮件号码。
六、 短消息命令
1、 AT+CSMS 选择消息服务。支持的服务有GSM-MO、SMS-MT、SMS-CB。
2、 AT+CNMA 新信息确认应答。
3、 AT+CPMS 优先信息存储。这个命令定义用来读写信息的存储区域。
4、 AT+CMGF 优先信息格式。执行格式有TEXT方式和PDU方式。
5、 AT+CSAS 保存设置。保存+CSAS和+CSMP的参数。
6、 AT+CRES 恢复设置。
7、 AT+CSDH 显示文本方式的参数。
8、 AT+CNMI 新信息指示。这个命令选择如何从网络上接收短信息。
9、 AT+CMGR 读短信。信息从+CPMS命令设定的存储器读取。
10、 AT+CMGL 列出存储的信息。
11、 AT+CMGS 发送信息。
12、 AT+CMGW 写短信息并存储。
13、 AT+CMSS 从存储器中发送信息。
14、 AT+CSMP 设置文本模式的参数。
15、 AT+CMGD 删除短信息。删除一个或多个短信息。
16、 AT+CSCA 短信服务中心地址。
17、 AT+CSCB 选择单元广播信息类型。
18、 AT+WCBM 单元广播信息标识。
19、 AT+WMSC 信息状态(是否读过、是否发送等等)修正。
20、 AT+WMGO 信息覆盖写入。
21、 AT+WUSS 不改变SMS状态。在执行+CMGR或+CMGL后仍保持UNREAD。
七、 追加服务命令
1、 AT+CCFC 呼叫继续。
2、 AT+CLCK 呼叫禁止。
3、 AT+CPWD 改变追加服务密码。
4、 AT+CCWA 呼叫等待。
5、 AT+CLIR 呼叫线确认限制。
6、 AT+CLIP 呼叫线确认陈述。
7、 AT+COLP 联络线确认陈述。
8、 AT+CAOC 费用报告。
9、 AT+CACM 累计呼叫计量。
10、 AT+CAMM 累计呼叫计量最大值。
11、 AT+CPUC 单价和货币表。
12、 AT+CHLD 呼叫相关的追加服务。
13、 AT+CLCC 列出当前的呼叫。
14、 AT+CSSN 追加服务通知。
15、 AT+CUSD 无组织的追加服务数据。
16、 AT+CCUG 关闭的用户组。
八、 数据命令
1、 AT+CBST 信差类型选择。
2、 AT+FCLASS 选择模式。这个命令把模块设置成数据或传真操作的特殊模式。
3、 AT+CR 服务报告控制。这个命令允许更为详细的服务报告。
4、 AT+CRC 划分的结果代码。这个命令在呼叫到来时允许更为详细的铃声指示。
5、 AT+ILRR 本地DTE-DCE速率报告。
6、 AT+CRLP 无线电通信线路协议参数。
7、 AT+DOPT 其他无线电通信线路参数。
8、 AT%C 数据压缩选择。
9、 AT+DS 是否允许V42二度数据压缩。
10、 AT+DR 是否报告V42二度数据压缩。
11、 AT\N 数据纠错选择。
九、 传真命令
1、 AT+FTM 传送速率。
2、 AT+FRM 接收速率
3、 AT+FTH 用HDLC协议设置传真传送速率。
4、 AT+FRH 用HDLC协议设置传真接收速率。
5、 AT+FTS 停止特定时期的传送并等待。
6、 AT+FRS 接收沉默。
十、 第二类传真命令
1、 AT+FDT 传送数据。
2、 AT+FDR 接收数据。
3、 AT+FET 传送页标点。
4、 AT+FPTS 页转换状态参数。
5、 AT+FK 终止会议。
6、 AT+FBOR 页转换字节顺序。
7、 AT+FBUF 缓冲大小报告。
8、 AT+FCQ 控制拷贝质量检验。
9、 AT+FCR 控制接收传真的能力。
10、 AT+FDIS 当前会议参数。
11、 AT+FDCC 设置DCE功能参数。
12、 AT+FLID 定义本地ID串。
13、 AT+FPHCTO 页转换超时参数。
十一、V24-V25命令
1、 AT+IPR 确定DTE速率。
2、 AT+ICF 确定DTE-DCE特征结构。
3、 AT+IFC 控制DTE-DCE本地流量。
4、 AT&C 设置DCD(数据携带检测)信号。
5、 AT&D 设置DTR(数据终端就绪)信号。
6、 AT&S 设置DST(数据设置就绪)信号。
7、 ATO 回到联机模式。
8、 ATQ 决定手机是否发送结果代码。
9、 ATV 决定DCE响应格式。
10、 ATZ 恢复为缺省设置。
11、 AT&W 保存设置。
12、 AT&T 自动测试。
13、 ATE 决定是否回显字符。
14、 AT&F 回到出厂时的设定。
15、 AT&V 显示模块设置情况。
16、 ATI 要求确认信息。这命令使GSM模块传送一行或多行特定的信息文字。
17、 AT+WMUX 数据/命令多路复用。
十二、特殊AT命令
1、 AT+CCED 电池环境描述。
2、 AT+CCED 自动RxLev指示。
3、 AT+WIND 一般指示。
4、 AT+ALEA 在ME和MSC之间的数据密码模式。
5、 AT+CRYPT 数据密码模式。
6、 AT+EXPKEY 键管理。
7、 AT+CPLMN 在PLMN上的信息。
8、 AT+ADC 模拟数字转换度量。
9、 AT+CMER 移动设备事件报告。这个命令决定是否允许在键按下时是否主动发送结果代码。
10、 AT+WLPR 读取语言偏好。
11、 AT+WLPW 写语言偏好。
12、 AT+WIOR 读取GPIO值。
13、 AT+WIOW 写GPIO值。
14、 AT+WIOM 输入/输出管理。
15、 AT+WAC 忽略命令。这个特殊命令允许忽略SMS、SS和可用的PLMN。
16、 AT+WTONE 播放旋律。
17、 AT+WDTMF 播放DTMF旋律。
18、 AT+WDWL 下载模式。
19、 AT+WVR 配置信差的声音速率。
20、 AT+WDR 配置数据速率。
21、 AT+WHWV 显示硬件的版本。
22、 AT+WDOP 显示产品的出厂日期。
23、 AT+WSVG 声音增益选择。
24、 AT+WSTR 返回指定状态的状态。
25、 AT+WSCAN 扫描。
26、 AT+WRIM 设置或返回铃声指示模式。
27、 AT+W32K 是否允许32kHz掉电方式。
28、 AT+WCDM 改变缺省旋律。
29、 AT+WSSW 显示内部软件版本。
30、 AT+WCCS 编辑或显示订制性质设置表。
31、 AT+WLCK 允许在特定的操作符上个性化ME。
32、 AT+CPHS 设置CPHS命令。
33、 AT+WBCM 电池充电管理。
34、 AT+WFM 特性管理。是否允许模块的某些特性,如带宽模式、SIM卡电压等。
35、 AT+WCFM 商业特性管理。是否允许Wavecom特殊特性。
36、 AT+WMIR 允许从当前存储的参数值创建定制的存储镜像。
37、 AT+WCDP 改变旋律的缺省播放器。
38、 AT+WMBN 设置SIM卡中的不同邮箱号码。
十三、SIM卡工具箱命令
1、 AT+STSF 配置工具箱实用程序。
2、 AT+STIN 工具箱指示。
3、 AT+STGI 获得从SIM卡发来的预期命令的信息。
4、 AT+STCR 主动提供的结果:工具箱控制反应。
5、 AT+STGR 给出响应。允许程序或用户从主菜单上选择项目,或响应某些命令
常用的与SMS有关的GSM AT指令(GSM07.05)如表1所示:
AT 指令
功 能
AT+CMGC
Send an SMS command(发出一条短消息命令)
AT+CMGD
Delete SMS message(删除SIM卡内存的短消息)
AT+CMGF
Select SMS message formate(选择短消息信息格式:0-PDU;1-文本)
AT+CMGL
List SMS message from preferred store(列出SIM卡中的短消息PDU/text: 0/"REC UNREAD"-未读,1/"REC READ"-已读,2/"STO UNSENT"-待发,3/"STO SENT"-已发,4/"ALL"-全部的)
AT+CMGR
Read SMS message(读短消息)
AT+CMGS
Send SMS message(发送短消息)
AT+CMGW
Write SMS message to memory(向SIM内存中写入待发的短消息)
AT+CMSS
Send SMS message from storage(从SIN|M内存中发送短消息)
AT+CNMI
New SMS message indications(显示新收到的短消息)
AT+CPMS
Preferred SMS message storage(选择短消息内存)
AT+CSCA
SMS service center address(短消息中心地址)
AT+CSCB
Select cell broadcast messages(选择蜂窝广播消息)
AT+CSMP
Set SMS text mode parameters(设置短消息文本模式参数)
AT+CSMS
Select Message Service(选择短消息服务)
以实例来说明这些指令的使用方法:
先用手机数据线将手机连接到电脑串口,并将串口的波特率设置为19200,可以开始了。
1、首先测试你的连接及手机是否支持AT指令,请在你的串口调试程序中输入:
AT<回车>
屏幕上返回"OK"表明计算机与手机连接正常,那样我们就可以进行其它的AT指令测试了
2、设置短信发送格式
AT+CMGF=1<回车>
屏幕上返回"OK"表明现在短信的发送方式为PDU方式,如果是设置为TEXT方式,则,AT+CMGF=0<回车>
3、 发送短信
发送内容及手要号仍旧同上面在编码中的一样,编码后,得到要发送的数据如下
0891683108705505F011000D91683117352446F2000800124F60597D002C00480065006C006C006F0021
我们用如下指令来发送
AT+CMGS=33<回车>
如果返回">",就把上面编码数据输入,并以CTRL+Z结尾,稍等一下,你就可以看到返回OK啦。
说明一下,为什么AT+CMGS=33呢,是这样得来的:
11000D91683117352446F2000800124F60597D002C00480065006C006C006F0021
这一段字符串的长度除以2得到的结果,上面的字符串,短信中心号加上短信内容得到的,怎么得到的,请回顾一下解码部份
在我们前面的讨论中,一条完整的短信发送,只要执行三条AT指令,AT、AT+CMGS=?、AT+CMGS=?就可以了。由于篇幅,我只能在这里提到这么多,大家要是想了解更多,可以向各手机厂商索取AT指令白皮书,里面很详细的。
串口通信
C#实现
通常,在C#中实现串口通信,我们有四种方法:
第一:通过MSCOMM控件这是最简单的,最方便的方法。可功能上很难做到控制自如,同时这个控件并不是系统本身所带,所以还得注册,不在本文讨论范围。可以访问http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=320
第二:微软在.NET新推出了一个串口控件,基于.NET的P/Invoke调用方法实现,详细的大家可以访问微软网站http://msdn.microsoft.com/msdnmag/issues/02/10/NETSerialComm/default.aspx,方便得到更多资料。
第三:就是用第三方控件
第四:自己用API写串口通信
Vc++用API调用串口非多线程
一、设置串口相关工作
#define MAXBLOCK 2048
#define XON 0x11
#define XOFF 0x13
BOOL SetCom(HANDLE &m_hCom, const char *m_sPort, int
BaudRate, int Databit, CString parity, CString stopbit)
{
COMMTIMEOUTS TimeOuts; ///串口输出时间 超时设置
DCB dcb; ///与端口匹配的设备
m_hCom=CreateFile(m_sPort, GENERIC_READ |
GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL |
FILE_FLAG_OVERLAPPED,
NULL); // 以重叠方式打开串口
if(m_hCom==INVALID_HANDLE_VALUE)
{
AfxMessageBox("设置串口部分,串口打开失败"); /////重叠方式
异步通信(INVALID_HANDLE_VALUE)函数失败。
return FALSE;
}
SetupComm(m_hCom,MAXBLOCK,MAXBLOCK); //设置缓冲区
memset(&TimeOuts,0,sizeof(TimeOuts));
TimeOuts.ReadIntervalTimeout=MAXDWORD; //
把间隔超时设为最大,把总超时设为0将导致ReadFile立即返回并完成操作
TimeOuts.ReadTotalTimeoutMultiplier=0; //读时间系数
TimeOuts.ReadTotalTimeoutConstant=0; //读时间常量
TimeOuts.WriteTotalTimeoutMultiplier=50;
//总超时=时间系数*要求读/写的字符数+时间常量
TimeOuts.WriteTotalTimeoutConstant=2000;
//设置写超时以指定WriteComm成员函数中的
SetCommTimeouts(m_hCom, &TimeOuts);
//GetOverlappedResult函数的等待时间*/
if(!GetCommState(m_hCom, &dcb))
////串口打开方式、端口、波特率 与端口匹配的设备
{
AfxMessageBox("GetCommState Failed");
return FALSE;
}
dcb.fParity=TRUE; //允许奇偶校验
dcb.fBinary=TRUE;
if(parity=="NONE")
dcb.Parity=NOPARITY;
if(parity=="ODD")
dcb.Parity=ODDPARITY;
if(parity=="EVEN")
dcb.Parity=EVENPARITY;
if(stopbit=="1")//设置波特率
dcb.StopBits=ONESTOPBIT;
//if(stopbit=="0")//设置波特率
// dcb.StopBits=NONESTOPBIT;
if(stopbit=="2")//设置波特率
dcb.StopBits=TWOSTOPBITS;
BOOL m_bEcho=FALSE; ///
int m_nFlowCtrl=0;
BOOL m_bNewLine=FALSE; ///
dcb.BaudRate=BaudRate; // 波特率
dcb.ByteSize=Databit; // 每字节位数
// 硬件流控制设置
dcb.fOutxCtsFlow=m_nFlowCtrl==1;
dcb.fRtsControl=m_nFlowCtrl==1
?RTS_CONTROL_HANDSHAKE:RTS_CONTROL_ENABLE;
// XON/XOFF流控制设置(软件流控制!)
dcb.fInX=dcb.fOutX=m_nFlowCtrl==2;
dcb.XonChar=XON;
dcb.XoffChar=XOFF;
dcb.XonLim=50;
dcb.XoffLim=50;
if(SetCommState(m_hCom, &dcb))
return TRUE; ////com的通讯口设置
else
{
AfxMessageBox("串口已打开,设置失败");
return FALSE;
}
}
二、读串口操作:
int ReadCom(HANDLE hComm, BYTE inbuff[], DWORD
&nBytesRead, int ReadTime)
{
DWORD lrc; ///纵向冗余校验
DWORD endtime; /////////jiesuo
static OVERLAPPED ol;
int ReadNumber=0;
int numCount=0 ; //控制读取的数目
DWORD dwErrorMask,nToRead;
COMSTAT comstat;
ol.Offset=0; ///相对文件开始的字节偏移量
ol.OffsetHigh=0;
///开始传送数据的字节偏移量的高位字,管道和通信时调用进程可忽略。
ol.hEvent=NULL; ///标识事件,数据传送完成时设为信号状态
ol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
endtime=GetTickCount()+ReadTime;//GetTickCount()取回系统开始至此所用的时间(毫秒)
for(int i=0;i<2000;i++)
inbuff[i]=0;
Sleep(ReadTime);
ClearCommError(hComm,&dwErrorMask,&comstat);
nToRead=min(2000,comstat.cbInQue);
if(int(nToRead)<2)
goto Loop;
if(!ReadFile(hComm,inbuff,nToRead,&nBytesRead,&ol))
{
if((lrc=GetLastError())==ERROR_IO_PENDING)
{
///////////////////
endtime=GetTickCount()+ReadTime;//GetTickCount()取回系统开始至此所用的时间(毫秒)
while(!GetOverlappedResult(hComm,&ol,&nBytesRead,FALSE))//该函数取回重叠操作的结果
{
if(GetTickCount()>endtime)
break;
}
}
}
return 1;
Loop: return 0;
}
三、写串口命令
int WriteCom(HANDLE hComm, BYTE Outbuff[], int size, int
bWrite[])
{
DWORD nBytesWrite,endtime,lrc;
static OVERLAPPED ol;
DWORD dwErrorMask,dwError;
COMSTAT comstat;
ol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
ol.Offset=0;
ol.OffsetHigh=0;
ol.hEvent=NULL; ///标识事件,数据传送完成时,将它设为信号状态
ClearCommError(hComm,&dwErrorMask,&comstat);
if(!WriteFile(hComm,Outbuff,size,&nBytesWrite,&ol))
{
if((lrc=GetLastError())==ERROR_IO_PENDING)
{
endtime=GetTickCount()+1000;
while(!GetOverlappedResult(hComm,&ol,&nBytesWrite,FALSE))
{
dwError=GetLastError();
if(GetTickCount()>endtime)
{
AfxMessageBox("写串口时间过长,目前串口发送缓冲区中的数据数目为空");
break;
}
if(dwError=ERROR_IO_INCOMPLETE)
continue; //未完全读完时的正常返回结果
else
{
// 发生错误,尝试恢复!
ClearCommError(hComm,&dwError,&comstat);
break;
}
}
}
}
FlushFileBuffers(hComm);
PurgeComm(hComm,PURGE_TXCLEAR);
bWrite=0;
return 1;
}
四、调用方法很简单,只需要将你的串口参数进行简单的设置就可以了。比如:
BOOL OpenCom()//设置COM
{
int Boundrate=9600;//波特率
CString StopBits="1";//停止位
int DataBits=8;//数据位
CString Parity="ODD";//奇偶校验
CString m_Port="COM1";
Return SetCom(m_hCom1,m_Port,Boundrate,DataBits,Parity,StopBits);
}
void Main()
{
int SIZE;
DWORD BytestoRead=52*Count+6;//要11个字节
int BWRITE[2];
int ReadTime=2000;
BYTE Outbuff[12]={0xff,0x00,0xea,0xff,0xea,0xff,0,0,0,0,0,0};
SIZE=sizeof(Outbuff);
WriteCom(m_hCom,Outbuff,SIZE,BWRITE);
ReadCom(m_hCom,m_Inbuff,BytestoRead,ReadTime);
//进行相应的解包处理
}
简单的Vb使用TEXT模式
使用Text模式发送短信其实很简单,对于简单的应用来说,该方法也不失于一种不错的选择.
先在项目中添加Mscomm控件,一般的部件栏中可能没有列出Mscomm控件,可以过右击部件栏,选择”部件”,或是通过在菜单中的”工程”选择”部件”,然后选中Microsoft
Comm Control 6.0即可.添加了Mscomm控件后,可以设置一些基本的参数.如果你使用Nokia的手机,你还必须安装data
suite(可以到Nokia的开发论坛上去下载一个),然后Mscomm的commport选择3;如果你使用其他手机,采用红外线接口,你必须安装红外线驱动程序.选择相应的端口.下面的代码是一些基本参数的设置:
Mscomm1.Settings=”9600,N,8,1” ‘9600波特,无奇偶校验,8位数据,一个停止位
Mscomm1.InputLen=0 ‘读入整个缓冲区
Mscomm1.Portopen=True ‘打开端口
发送短消息的代码如下:
MSComm1.Output = "AT+CMGF=1" + vbCr ‘设置发送的模式,注意:一定要加上
vbCr
MSComm1.Output = "AT+CSCA=" & Chr$(34) & "8613010341500" &
Chr$(34) & ",129" + vbCr ‘8613010341500是短消息中心,各地的号码不一样,必须设置当地的短消息号码
MSComm1.Output = "AT+CMGS=" & Chr$(34) & "13057575064" &
Chr$(34) & ",129" + vbCr ‘13057575064是对方手机号
MSComm1.Output = "test" & Chr$(26) ‘chr$(26)是Ctr+ Z
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/qianbo_0423/archive/2006/02/17/601029.aspx
发表评论
-
repeater绑定基础类型列表
2010-04-11 14:10 1327List<string> str = {&q ... -
Jquery Ajax在.net中的应用
2010-04-10 22:34 1805新建一个webservice类 [WebMetho ... -
Asp.Net单元测试
2010-02-10 20:55 1528一 单元测试简介 单元测试是代码正确性验证的最重要 ... -
C#窗体间传递参数
2009-12-07 16:39 2483例如,两个窗体,一个主窗体mainForm,一个子窗体chil ... -
利用飞信短信接口实现发送短信
2009-11-30 11:55 3744飞信提供了短信接口,利用这个接口可以发短信,首页你得有一个飞信 ... -
webDeployment固定dll
2009-11-25 22:36 962在.Net开发网站中,发布的时候会产生动态链接库dll ... -
FreeTextBox的配置
2009-11-25 11:52 1353FreeTextBox是一款免费的Asp.net网页编辑器,官 ... -
配置AjaxControlTool,不用在页面上注册
2009-11-25 11:49 1008在使用AjaxControlToolKit的时候,总是要在页面 ... -
sys未定义的解决方法
2009-11-25 11:38 1159这个问题的解决方法有很多,出现这个问题的原因是在使用Ajax的 ... -
一道趣味数学题,很有意思
2009-11-23 16:25 1074123456789这九个按顺序排列的数,要求在它们之间插入若干 ... -
ASP.NET 在线压缩与解压文件
2009-11-13 13:30 1700压缩与解压函数 using System; using ... -
ASP.NET实现文件下载
2009-11-13 12:11 2448//TransmitFile实现下载 ...
相关推荐
MCS-51系列单片机控制手机收发短信息的原理可以实现基于GSM短消息功能,做成传输各种检测、监控数据信号和控制命令的数据通信系统,能广泛用于远程监控、定位导航、个人通信终端等。 单片机控制手机收发短信息的...
* 使用 SIM 卡前,应保证该 SIM 卡在手机上能正常接收和发送短信息。 * 应在关掉电源时,才能插入 SIM 卡,通电开机延迟 1 分钟后,红色指示灯每四秒闪动一次,为 GSM 网络在线指示才能正常设置使用。 二、模块...
手机短信发送和接收是移动通信领域中的基本功能,它允许用户通过手机设备进行文本消息的交互。短信服务(Short Message Service, SMS)自20世纪90年代以来已经成为全球最广泛使用的通信方式之一,尤其在个人和商业...
因为手机短消息的发送是以PDU串的形式发送出去的,中文字符以Unicode码来表示,所以在发送中文短消息之前必须首先将中文字符转换为Unicode码,下面的函数将实现这个功能。这个函数主要应用到VB自带的一个格式转换...
首先,我们需要理解手机发送短信的基本原理。短信服务(Short Message Service,SMS)是通过GSM或CDMA网络来传输短消息的通信方式。在VB.NET中,我们通常不会直接与移动网络进行交互,而是通过连接到短信网关来发送...
当需要向手机发送短信时,系统会通过GSM网络将信息编码并发送至目标手机的短消息服务中心(SMS Center),再由短消息服务中心转发至目标手机。这一过程涉及到多个技术细节,包括信令流程、编码格式、错误检测与纠正...
手机短信的发送和接收原理是通信技术中的一个基础部分,主要涉及到字符编码、PDU(Protocol Data Unit)格式以及AT指令集的使用。在本文档中,我们将深入探讨这些概念,并展示如何通过VB编程实现短信的发送。 首先...
本主题聚焦于使用C#实现手机发送短信的功能。这个功能通常涉及到移动通信技术、网络编程以及API调用等技术。 一、C#与.NET框架 C#是微软开发的一种面向对象的编程语言,它基于.NET框架,提供了丰富的类库和API,...
在提供的文件“自动发送短信息.jar”中,我们可以推测这是一个已经封装好自动发送短信功能的Java应用程序。用户可能需要将其安装到支持Java的设备上,然后按照软件内的指南进行设置,以便自动发送短信。不过,具体的...
在本项目中,“VB电脑发送手机短信”指的是使用VB编程来实现在计算机上通过连接手机或使用特定服务,向其他手机发送短信的功能。这种功能在各种应用场景中都有用到,比如系统通知、营销推广或者自动化流程。 实现VB...
根据提供的文件信息,本文将详细解释如何使用Java发送短信到手机以及进行相关的查询操作。文章首先会概述如何通过Java程序实现短信发送功能,并探讨其实现原理。随后将深入讨论示例代码中的具体方法,包括发送短信...
GSM的短消息业务通过信令信道传输,无需建立专门的连接即可发送信息至短信服务中心,再由服务中心转发给最终接收方。因此,即使接收方终端未开机,信息也不会丢失。 目前市场上的手机大多支持GSM07.05标准下的AT...
短信猫是一种可以通过串行接口连接到计算机,并通过AT命令集发送和接收短消息的服务设备。在实际应用中,这种技术常用于自动化的消息通知系统、远程监控系统等场景。 #### 关键知识点 1. **串口通信基础知识** - ...
- AT+CMGR、AT+CMGS、AT+CMGL等:读取、发送、列出和删除短消息 **应用实例** 在实际应用中,比如设计基于GSM的SMS数据采集器,单片机可以通过控制手机收发短信,实现数据的实时传输。例如,它可以收集远程传感器...
【VC开发WM手机发送短信源代码详解】 在移动设备开发领域,Windows Mobile(WM)操作系统曾经广泛应用于智能手机和平板电脑。VC++(Visual C++)是微软开发的一款强大的C++集成开发环境,它支持创建包括WM在内的...
短信的结构包括短消息中心地址和目的地址,前者包含SMSC的编码信息,后者包含接收方的电话号码,这些都需要按照特定的格式进行编码。 AT指令是与GSM MODEM或支持AT指令的手机进行交互的标准命令集。在终端方式发送...
【短信猫手机短信发送程序】是一款基于C#编程语言开发的应用程序,主要用于通过短信猫设备向手机发送报警短信。短信猫是一种硬件设备,它能够连接到计算机并模拟手机功能,从而实现通过电脑来发送和接收短信。在工业...
6. **安全措施**:为了防止恶意攻击,需要限制同一手机号在短时间内多次发送验证码。可以设置IP限流策略,或者针对每个手机号设置发送次数限制。 7. **用户输入验证**:在客户端,收到验证码后,用户输入的验证码...
1. **免费短信服务的工作原理**:解释这些服务如何通过广告支持、合作推广或者其他商业模式来维持运营,同时让用户免费使用。 2. **安全性与隐私保护**:讨论在无需注册和匿名使用的情况下,如何确保用户的隐私不被...