要在你的基于Windows CE的产品上具备无线通讯(拨号上网、拨打电话、收发短信)功能,你的选择是要么让用户外接手机,要么在你的产品上集成手机模块。如果是外接手机,那么手机只是起到在上网浏览期间接收和发送数据的作用。如果必须集成手机模块,那么手机模块要完成无线通讯的全部功能,从软件开发角度讲,相对要麻烦一点。本篇文章简略地讲解在开发控制手机模块的软件过程中需要注意的事项。
一、拨号上网
在连接Internet浏览网页过程中,手机模块负责连接ISP、从ISP接收数据和发送数据。如果ISP为中国移动,那么有两种拨号号码,一种号码为17201,属于普通的拨号上网业务,可以以9.6Kbps的数据传输速率接入到CMNET;另一种号码为*99# ,利用GRPS来加速接收和发送数据,GPRS接入方式提供30KB/秒到40KB/秒的接入速度,使用数据加速系统后可以达到60KB/秒到80KB/秒。Windows CE提供对拨号连接的支持,具体需要调用哪些API我在前面的文章中讲过了(参见《Windows CE下拨号上网》)。利用RAS函数,我们只需要确定连接手机模块的串口,输入用户名、密码、电话号码就可以连接到ISP了,接着只要调用IE浏览器就可以轻松浏览网页了,整个功能的实现我们只做了很少的工作。不过利用RAS函数有利有弊,利在开发相对容易一些,弊在它掩盖了底层的实现,从《Windows CE下拨号上网》的图中可以看出,RAS是实现拨号连接的最上层,TAPI和Unimodem是主要的实现层。换句话说你想在RAS层设置例如串口波特率是不可能的。而CE默认的拨号连接记录中串口波特率为19200,相对于17201的数据传输速度来说都慢,更何况是GPRS。要设置串口的波特率为最大值115200,可行的办法有两个,一个是放弃RAS,调用TAPI函数实现拨号上网,TAPI函数中有几个函数例如带界面的lineConfigDialogEdit和无界面的lineDevSpecific 都可以设置波特率;另一个方法要简单的多,在CE下先用CE自带的"拨号连接"程序建立一个拨号记录,在建立过程中可以设置波特率,这个拨号记录的数据被保存到注册表中。如果自己开发拨号程序,那么只要在拨号前到注册表中找到拨号记录就可以了。通过这种方法就可以设置波特率了。如果你的CE平台不支持永久保存注册表,那么可以把拨号记录的数据直接保存到PB中,这样定制的内核本身就包含一个拨号记录,可以任意读取。
二、拨打电话、收发短信
实现拨打电话和收发短信,利用的是AT命令集和串口通讯。因为CE的串口不支持重叠,所以在拨号和网页浏览期间是不能再次打开同一个串口的。关于串口通讯我以前写过一篇文章,不过其中接收串口数据的线程不适合接收手机模块返回的数据,必须针对手机模块的特点构架一个合理的模型。下面我谈谈我在开发过程中遇到的两个问题,如果您有不同见解请发邮件给我,我希望能得到您的宝贵意见。
1、不像手机,有些手机模块不具备存储功能,所以每次在启动的时候都要初始化一些必要的设置。如设置短信文本模式、字符格式、麦克和听筒的音量等。实际的初始化会更多。这种情况下如果发送一个命令后紧接着发送另一个命令,那么手机模块是吃不消的。必须先发送一个命令,然后等待手机模块对这个命令的返回结果,如果成功了再发送下一个命令,这才能够保证初始化都能成功完成,而且可以实时显示当前工作状态。
2、手机模块返回的信息不确定。任何发送到手机模块的命令都会被返回,返回的字符串中可能包含对命令的响应,也可能不包含。这样就必须对整个返回信息做检索工作,而且还要区分返回的信息是否是对命令的响应。如"\r\nRING\r\n"就不是对命令的响应。
实际遇到的问题不止这两个,所以在构架接收数据部分和处理数据部分的时候要把问题考虑全了。