文献标识码:A
DOI:10.16157/j.issn.0258-7998.2015.09.006
中文引用格式:陈华云,崔晓伟,陈从华. 车载移动终端自适应无线通信模块的方案设计[J].电子技术应用,2015,41(9):25-28.
英文引用格式:Chen Huayun,Cui Xiaowei,Chen Conghua. The design of mobile terminal for vehicle self-adaptive wireless communication module[J].Application of Electronic Technique,2015,41(9):25-28.
0 引言
车载移动终端包括国标中规定的汽车行驶记录仪、交通运输行业中规定的车载视频终端等装在车上的车机系统。由于车载平台的业务多样化,导致车载终端的硬件类型也不同,比如车载终端上使用的无线通信模块,同一款终端上,因为需求的不同,就得使用不同类型无线通信模块;例如使用不同的运营商、不同网络类型[1]。所以车载终端针对不同的无线通信模块就要做出相应的调整,包括硬件接口、软件程序都要做针对性的设计。这样就导致了产品种类多样,代码版本繁多,而且不同的产品还得对应不同的代码。这样不仅导致很多代码的重复和冗余,而且每次编译耗费时间和精力,增加了人工成本,且出厂前需要针对不同型号的无线通信模块进行检测,也容易造成编译问题,甚至造成产品无法使用等问题。
针对该问题,本文提出了一种基于Linux的车载移动终端自适应无线通信模块的方法,该方法从硬件和软件上分别进行改进设计,使得车载移动终端可自动识别当前使用的是哪种型号的无线通信模块(移动、联通,3G、4G),识别到无线通信模块后,调用相对应的模块函数对该无线通信模块进行初始化,并开始进入正常的工作模式。
1 硬件设计
1.1 硬件接口设计
由于不同无线通信模块的引脚设计不同[2],为了使一台车载终端能够同时兼容使用不同的无线通信模块,必须把两者分开设计后再通过统一接口对接。车载终端方面设计了一个固定的插槽,插槽上插的是一个叫作“转接板”的硬件小板,无线通信模块直接与转接板整合在一起,转接板内部的设计根据不同的无线通信模块作出相应的变动,对外提供统一固定的引脚,以便与车载终端的插槽对接。这样车载终端只需要提供一种硬件插槽,通过转接板就可以与不同的无线通信模块对接[3]。不同的无线通信模块对应不同的转接板,转接板对外提供的引脚如图1所示。
通过这样一种对接设计,就可以使车载终端实现在硬件上与不同的无线通信模块建立连接。当同一款车载终端需要使用不同的无线通信模块时,直接换成对应的无线通信模块转接板即可。
1.2 模块时序控制
通过上述统一硬件接口设计后,车载终端就可以直接通过转接板的“GSM_VCC”、“GSM_GND”、“POWERON”等引脚来控制无线通信模块上下电。对无线通信模块上下电需要特定的时序,不同的无线模块上下电时序也不同[2],图2为某电信无线通信模块的上电时序图,图3为某联通模块的上电时序图。
由于车载移动终端需要兼容使用各种不同的无线通信模块,并且在车载终端上电时无法知道当前使用的是那种无线通信模块,也就不能确定要用那种上电时序给通信模块上电。为此,本文在综合分析各种模块的专用上电时序后,设计出了一种通用的上电时序,该时序可以对接入车载移动终端的多种无线通信模块上电,如图4。该通用时序是取自各无线通信模块各自时序的共性点,比如在上电时序中,都必须把VBAT拉高,这个是供电脚;然后再拉低、拉高POWER ON引脚来完成上电。不同的POWER ON引脚拉低的持续时间不同,不过这个持续时间是有一个范围的,如图3中的电信模块最少需要64 ms,图4中联通模块最少需要30 ms。因此在通用时序中的POWER ON引脚的拉低时间只要大于所有的无线通信模块各自的拉低时间即可,即:通用时序POWER ON拉低时间>MAX(无线通信模块各自的POWER ON拉低时间)。
已测试可以使用通用时序上电的无线通信模块列表如表1所示。
通过该时序,车载移动终端就可以在不知当前是哪种无线通信模块的情况下给通信模块上电,为接来下的模块识别工作奠定基础。
2 软件设计
2.1 识别无线通信模块
成功给无线通信模块上电后,就必须进行模块识别,模块识别是根据模块本身的特征属性来实现的。本文使用了识别PID/VID加AT指令通信的组合方式来识别无线通信模块类型。
3G、4G无线通信模块是使用USB口来进行通信,因而可以看做是一个USB设备,而根据USB规范的规定,每个USB设备都必须有产商ID(VID)和产品ID(PID),而且都应该是唯一的。并且该PID/VID会在车载移动终端给无线通信模块上电后,注册到车载终端的Linux系统总线上,因此可以通过查找并匹配系统总线上的PID/VID来识别当前无线通信模块的型号[4]。由于各种原因,一个厂商的不同型号的产品往往只使用一组PID/VID,因此如果一组PID/VID对应了多种无线通信模块,就必须再通过AT指令通信的方式来进一步识别。这里的AT指令是通过USB口来进行通信的。
2G无线通信模块不是使用USB口来进行通信的,而是使用串口来通信,因此不能通过PID/VID来进行识别,只能通过串口的AT通信才能识别。AT通信的主要目的是直接获取模块的版本类型。识别无线通信模块的具体步骤如下所示:
(1)设计一种通用的上电时序,在车载移动终端系统启动后,终端就通过该时序对无线通信模块进行上电,上电后,无线通信模块就会接入终端系统中。
(2)判断是否能够从Linux系统总线获取到无线通信模块的PID/VID,若可以,则提取无线通信模块的PID/VID,并且查找预设对应文件,获取当前PID/VID对应的无线通信模块型号。其中预设对应文件是一个前期就拟定好的对应表,列出目前在用的所有无线通信模块型号和其对应的PID/VID,不同的PID/VID对应着各自的模块,这样方便查找和增加模块,部分预设对应文件如表2所示。接着判断当前PID/VID是否仅对应一个无线通信模块,如果是,则获取无线通信模块型号后,以面向对象中多态的方法调用该无线通信模块对应的初始化函数,进行模块初始化。如果当前PID/VID不止对应一个无线通信模块,则打开USB通信口,车载终端系统通过USB通信口给无线通信模块发送获取版本类型的AT指令,获取无线通信模块的版本类型,然后再查找预设的对应文件来获取模块型号,最后进行模块初始化。
(3)如果不能够从Linux系统总线中获取到无线通信模块的PID/VID,则说明该模块不是使用USB口来通信的,因此需要打开串口,车载终端系统通过串口给无线通信模块直接发送获取版本类型的AT指令,直接获取无线通信模块的版本类型,然后再查找预设的对应文件来获取模块型号,最后进行模块初始化。
经过上述步骤,基本就可以确认当前使用的无线通信模块是那种型号。图5是识别模块的流程图。
上述步骤中获取PID/VID的方法是通过移植Linux的开源框架代码lsusb模块,通过裁剪分离出特定的功能后加以使用。打开串口或者USB口进行AT查询指令的发送这个步骤中,使用通用的AT指令“AT+CGMM”,无线通信模块在接收到该指令后,会产生一条应答指令,如“SIMCOM_SIM5218C OK”,这样就可以通过应答指令获取到模块相关信息[5]。
2.2 业务软件框架设计
无线通信模块的基本功能包括电话、短信、拨号上网等。 由于无线通信模块的多样性,为了使软件设计一次、编译一次就可以同时支持多种无线通信模块,并且要求设计上通用、简洁、可扩展性强、维护性高。因此使用了面向对象编程中的多态的设计思想。多态性指的是相同对象收到不同的消息或者不同对象收到相同消息时产生不同的实现动作,使得不管传递过来的是哪个类的对象,函数都可以通过一个接口调用到不同的无线通信模块所关联的实现方法。
本文的软件设计使用的是C++语言,C++支持两种多态性:编译时的多态性和运行时的多态性。编译时的多态性是通过重载函数来实现,本文使用的是运行时的多态性,是通过虚函数来实现的[6]。无线通信模块多态实现的流程如下:
(1)构建无线通信模块基类;
(2)构建H330类、LC6311+类、SIM5218C类等特定类型的派生类;
(3)声明无线通信模块基类指针;
(4)获取无线通信模块类型;
(5)设定基类指针指向特定派生类;
(6)业务功能类中通过基类指针来实现各派生类的功能。
实现流程图如图6所示。其中基类中实现的是各种无线通信模块都必须用到的而且基本都相同的功能,这些功能都是以虚函数定义的,在必要的情况下派生类可以以超载的形式实现各自个性化的需求。比如在基类中实现的一个拨号虚函数DialUp()里的内容中使用的指令是“ATD”,这个“ATD”指令适用于多种无线通信模块,而MC703无线通信模块中使用的拨号指令为“AT+CDV”,因此在MC703通信模块的派生类中就必须对DialUp()进行超载。同时使用虚函数也是为了在继承时实现运行时的多态性。
该类中还设计了一些纯虚函数,纯虚函数是指在基类中只声明而没有定义的虚函数,但要求任何派生类都要定义自己实现的方法。在基类中实现纯虚函数的方法是在函数的原型后加“=0”(例virtual void FunCtion=0;)。这里使用纯虚函数的主要目的是在各个派生类中规范出一个统一的框架结构。
完成基类的设计,就可以通过继承来实现各种派生类,派生类中主要是实现自己的个性化功能和新的功能,比如上电时序差异性、初始化设置的不同等。由于基类中都已经定义好了函数接口,所以派生类中只需在基类的接口上进行超载(重写实现过程)。为了更好地使用,派生类使用了公有继承的方式。
通过上述业务软件框架的设计,就可以实现运行时的多态效果,在设计好的无线通信模块范围内,无论目前使用的是哪种无线通信模块,系统都能在运行时用与之相对应的代码函数来实现相应的功能。还能提供快速添加一款新的无线通信模块的功能, 即只需通过基类继承出一个派生类,然后在派生类中实现自己的个性化需求即可。
3 总结
本文涉及了车载移动终端智能控制领域,具体介绍了车载移动终端自适应无线通信模块的方法。首先在硬件上设计了一款车载终端和不同通信模块对接的转接板,通过综合分析各种模块的专用上电时序后设计出了一种通用的上电时序,并通过无线通信模块本身的PID/VID属性加AT指令操作的方式进行模块识别,最后通过C++多态的思想,构建基类,以基类继承出各种不同无线通信模块的派生类,实现运行时的多态功能。通过该方法成功实现了一台车载移动终端自适应多种无线通信模块的功能,提高了效率,缩短了各种生产和维护的成本。
参考文献
[1] 赵晗.现代无线通信技术的发展现状及未来发展趋势[J].企业技术开发,2011,30(16):88-89.
[2] SIMCOM Tech.SIM6320C_hardware design_V1.00[Z].2012.
[3] 武明虎,刘晓静,陈晓林.基于MC35i模块的GSM移动通信终端的硬件设计[J].计算机与数字工程,2010,38(2):152-154.
[4] 刘泉承.基于S3C2440A嵌入式Linux系统USB驱动的研究与应用[D].南昌:江西科技师范大学,2012.
[5] SIMCOM Tech.SIMCOM_SIM5218_ATC_EN_V1.07[Z].2011.
[6] 谭浩强.C++程序设计(第二版)[M].北京:清华大学出版社,2011.