文獻(xiàn)標(biāo)識(shí)碼: A
DOI:10.16157/j.issn.0258-7998.2015.09.006
中文引用格式: 陳華云,崔曉偉,陳從華. 車載移動(dòng)終端自適應(yīng)無(wú)線通信模塊的方案設(shè)計(jì)[J].電子技術(shù)應(yīng)用,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 引言
車載移動(dòng)終端包括國(guó)標(biāo)中規(guī)定的汽車行駛記錄儀、交通運(yùn)輸行業(yè)中規(guī)定的車載視頻終端等裝在車上的車機(jī)系統(tǒng)。由于車載平臺(tái)的業(yè)務(wù)多樣化,導(dǎo)致車載終端的硬件類型也不同,比如車載終端上使用的無(wú)線通信模塊,同一款終端上,因?yàn)樾枨蟮牟煌?,就得使用不同類型無(wú)線通信模塊;例如使用不同的運(yùn)營(yíng)商、不同網(wǎng)絡(luò)類型[1]。所以車載終端針對(duì)不同的無(wú)線通信模塊就要做出相應(yīng)的調(diào)整,包括硬件接口、軟件程序都要做針對(duì)性的設(shè)計(jì)。這樣就導(dǎo)致了產(chǎn)品種類多樣,代碼版本繁多,而且不同的產(chǎn)品還得對(duì)應(yīng)不同的代碼。這樣不僅導(dǎo)致很多代碼的重復(fù)和冗余,而且每次編譯耗費(fèi)時(shí)間和精力,增加了人工成本,且出廠前需要針對(duì)不同型號(hào)的無(wú)線通信模塊進(jìn)行檢測(cè),也容易造成編譯問(wèn)題,甚至造成產(chǎn)品無(wú)法使用等問(wèn)題。
針對(duì)該問(wèn)題,本文提出了一種基于Linux的車載移動(dòng)終端自適應(yīng)無(wú)線通信模塊的方法,該方法從硬件和軟件上分別進(jìn)行改進(jìn)設(shè)計(jì),使得車載移動(dòng)終端可自動(dòng)識(shí)別當(dāng)前使用的是哪種型號(hào)的無(wú)線通信模塊(移動(dòng)、聯(lián)通,3G、4G),識(shí)別到無(wú)線通信模塊后,調(diào)用相對(duì)應(yīng)的模塊函數(shù)對(duì)該無(wú)線通信模塊進(jìn)行初始化,并開(kāi)始進(jìn)入正常的工作模式。
1 硬件設(shè)計(jì)
1.1 硬件接口設(shè)計(jì)
由于不同無(wú)線通信模塊的引腳設(shè)計(jì)不同[2],為了使一臺(tái)車載終端能夠同時(shí)兼容使用不同的無(wú)線通信模塊,必須把兩者分開(kāi)設(shè)計(jì)后再通過(guò)統(tǒng)一接口對(duì)接。車載終端方面設(shè)計(jì)了一個(gè)固定的插槽,插槽上插的是一個(gè)叫作“轉(zhuǎn)接板”的硬件小板,無(wú)線通信模塊直接與轉(zhuǎn)接板整合在一起,轉(zhuǎn)接板內(nèi)部的設(shè)計(jì)根據(jù)不同的無(wú)線通信模塊作出相應(yīng)的變動(dòng),對(duì)外提供統(tǒng)一固定的引腳,以便與車載終端的插槽對(duì)接。這樣車載終端只需要提供一種硬件插槽,通過(guò)轉(zhuǎn)接板就可以與不同的無(wú)線通信模塊對(duì)接[3]。不同的無(wú)線通信模塊對(duì)應(yīng)不同的轉(zhuǎn)接板,轉(zhuǎn)接板對(duì)外提供的引腳如圖1所示。
通過(guò)這樣一種對(duì)接設(shè)計(jì),就可以使車載終端實(shí)現(xiàn)在硬件上與不同的無(wú)線通信模塊建立連接。當(dāng)同一款車載終端需要使用不同的無(wú)線通信模塊時(shí),直接換成對(duì)應(yīng)的無(wú)線通信模塊轉(zhuǎn)接板即可。
1.2 模塊時(shí)序控制
通過(guò)上述統(tǒng)一硬件接口設(shè)計(jì)后,車載終端就可以直接通過(guò)轉(zhuǎn)接板的“GSM_VCC”、“GSM_GND”、“POWERON”等引腳來(lái)控制無(wú)線通信模塊上下電。對(duì)無(wú)線通信模塊上下電需要特定的時(shí)序,不同的無(wú)線模塊上下電時(shí)序也不同[2],圖2為某電信無(wú)線通信模塊的上電時(shí)序圖,圖3為某聯(lián)通模塊的上電時(shí)序圖。
由于車載移動(dòng)終端需要兼容使用各種不同的無(wú)線通信模塊,并且在車載終端上電時(shí)無(wú)法知道當(dāng)前使用的是那種無(wú)線通信模塊,也就不能確定要用那種上電時(shí)序給通信模塊上電。為此,本文在綜合分析各種模塊的專用上電時(shí)序后,設(shè)計(jì)出了一種通用的上電時(shí)序,該時(shí)序可以對(duì)接入車載移動(dòng)終端的多種無(wú)線通信模塊上電,如圖4。該通用時(shí)序是取自各無(wú)線通信模塊各自時(shí)序的共性點(diǎn),比如在上電時(shí)序中,都必須把VBAT拉高,這個(gè)是供電腳;然后再拉低、拉高POWER ON引腳來(lái)完成上電。不同的POWER ON引腳拉低的持續(xù)時(shí)間不同,不過(guò)這個(gè)持續(xù)時(shí)間是有一個(gè)范圍的,如圖3中的電信模塊最少需要64 ms,圖4中聯(lián)通模塊最少需要30 ms。因此在通用時(shí)序中的POWER ON引腳的拉低時(shí)間只要大于所有的無(wú)線通信模塊各自的拉低時(shí)間即可,即:通用時(shí)序POWER ON拉低時(shí)間>MAX(無(wú)線通信模塊各自的POWER ON拉低時(shí)間)。
已測(cè)試可以使用通用時(shí)序上電的無(wú)線通信模塊列表如表1所示。
通過(guò)該時(shí)序,車載移動(dòng)終端就可以在不知當(dāng)前是哪種無(wú)線通信模塊的情況下給通信模塊上電,為接來(lái)下的模塊識(shí)別工作奠定基礎(chǔ)。
2 軟件設(shè)計(jì)
2.1 識(shí)別無(wú)線通信模塊
成功給無(wú)線通信模塊上電后,就必須進(jìn)行模塊識(shí)別,模塊識(shí)別是根據(jù)模塊本身的特征屬性來(lái)實(shí)現(xiàn)的。本文使用了識(shí)別PID/VID加AT指令通信的組合方式來(lái)識(shí)別無(wú)線通信模塊類型。
3G、4G無(wú)線通信模塊是使用USB口來(lái)進(jìn)行通信,因而可以看做是一個(gè)USB設(shè)備,而根據(jù)USB規(guī)范的規(guī)定,每個(gè)USB設(shè)備都必須有產(chǎn)商ID(VID)和產(chǎn)品ID(PID),而且都應(yīng)該是唯一的。并且該P(yáng)ID/VID會(huì)在車載移動(dòng)終端給無(wú)線通信模塊上電后,注冊(cè)到車載終端的Linux系統(tǒng)總線上,因此可以通過(guò)查找并匹配系統(tǒng)總線上的PID/VID來(lái)識(shí)別當(dāng)前無(wú)線通信模塊的型號(hào)[4]。由于各種原因,一個(gè)廠商的不同型號(hào)的產(chǎn)品往往只使用一組PID/VID,因此如果一組PID/VID對(duì)應(yīng)了多種無(wú)線通信模塊,就必須再通過(guò)AT指令通信的方式來(lái)進(jìn)一步識(shí)別。這里的AT指令是通過(guò)USB口來(lái)進(jìn)行通信的。
2G無(wú)線通信模塊不是使用USB口來(lái)進(jìn)行通信的,而是使用串口來(lái)通信,因此不能通過(guò)PID/VID來(lái)進(jìn)行識(shí)別,只能通過(guò)串口的AT通信才能識(shí)別。AT通信的主要目的是直接獲取模塊的版本類型。識(shí)別無(wú)線通信模塊的具體步驟如下所示:
(1)設(shè)計(jì)一種通用的上電時(shí)序,在車載移動(dòng)終端系統(tǒng)啟動(dòng)后,終端就通過(guò)該時(shí)序?qū)o(wú)線通信模塊進(jìn)行上電,上電后,無(wú)線通信模塊就會(huì)接入終端系統(tǒng)中。
(2)判斷是否能夠從Linux系統(tǒng)總線獲取到無(wú)線通信模塊的PID/VID,若可以,則提取無(wú)線通信模塊的PID/VID,并且查找預(yù)設(shè)對(duì)應(yīng)文件,獲取當(dāng)前PID/VID對(duì)應(yīng)的無(wú)線通信模塊型號(hào)。其中預(yù)設(shè)對(duì)應(yīng)文件是一個(gè)前期就擬定好的對(duì)應(yīng)表,列出目前在用的所有無(wú)線通信模塊型號(hào)和其對(duì)應(yīng)的PID/VID,不同的PID/VID對(duì)應(yīng)著各自的模塊,這樣方便查找和增加模塊,部分預(yù)設(shè)對(duì)應(yīng)文件如表2所示。接著判斷當(dāng)前PID/VID是否僅對(duì)應(yīng)一個(gè)無(wú)線通信模塊,如果是,則獲取無(wú)線通信模塊型號(hào)后,以面向?qū)ο笾卸鄳B(tài)的方法調(diào)用該無(wú)線通信模塊對(duì)應(yīng)的初始化函數(shù),進(jìn)行模塊初始化。如果當(dāng)前PID/VID不止對(duì)應(yīng)一個(gè)無(wú)線通信模塊,則打開(kāi)USB通信口,車載終端系統(tǒng)通過(guò)USB通信口給無(wú)線通信模塊發(fā)送獲取版本類型的AT指令,獲取無(wú)線通信模塊的版本類型,然后再查找預(yù)設(shè)的對(duì)應(yīng)文件來(lái)獲取模塊型號(hào),最后進(jìn)行模塊初始化。
(3)如果不能夠從Linux系統(tǒng)總線中獲取到無(wú)線通信模塊的PID/VID,則說(shuō)明該模塊不是使用USB口來(lái)通信的,因此需要打開(kāi)串口,車載終端系統(tǒng)通過(guò)串口給無(wú)線通信模塊直接發(fā)送獲取版本類型的AT指令,直接獲取無(wú)線通信模塊的版本類型,然后再查找預(yù)設(shè)的對(duì)應(yīng)文件來(lái)獲取模塊型號(hào),最后進(jìn)行模塊初始化。
經(jīng)過(guò)上述步驟,基本就可以確認(rèn)當(dāng)前使用的無(wú)線通信模塊是那種型號(hào)。圖5是識(shí)別模塊的流程圖。
上述步驟中獲取PID/VID的方法是通過(guò)移植Linux的開(kāi)源框架代碼lsusb模塊,通過(guò)裁剪分離出特定的功能后加以使用。打開(kāi)串口或者USB口進(jìn)行AT查詢指令的發(fā)送這個(gè)步驟中,使用通用的AT指令“AT+CGMM”,無(wú)線通信模塊在接收到該指令后,會(huì)產(chǎn)生一條應(yīng)答指令,如“SIMCOM_SIM5218C OK”,這樣就可以通過(guò)應(yīng)答指令獲取到模塊相關(guān)信息[5]。
2.2 業(yè)務(wù)軟件框架設(shè)計(jì)
無(wú)線通信模塊的基本功能包括電話、短信、撥號(hào)上網(wǎng)等。 由于無(wú)線通信模塊的多樣性,為了使軟件設(shè)計(jì)一次、編譯一次就可以同時(shí)支持多種無(wú)線通信模塊,并且要求設(shè)計(jì)上通用、簡(jiǎn)潔、可擴(kuò)展性強(qiáng)、維護(hù)性高。因此使用了面向?qū)ο缶幊讨械亩鄳B(tài)的設(shè)計(jì)思想。多態(tài)性指的是相同對(duì)象收到不同的消息或者不同對(duì)象收到相同消息時(shí)產(chǎn)生不同的實(shí)現(xiàn)動(dòng)作,使得不管傳遞過(guò)來(lái)的是哪個(gè)類的對(duì)象,函數(shù)都可以通過(guò)一個(gè)接口調(diào)用到不同的無(wú)線通信模塊所關(guān)聯(lián)的實(shí)現(xiàn)方法。
本文的軟件設(shè)計(jì)使用的是C++語(yǔ)言,C++支持兩種多態(tài)性:編譯時(shí)的多態(tài)性和運(yùn)行時(shí)的多態(tài)性。編譯時(shí)的多態(tài)性是通過(guò)重載函數(shù)來(lái)實(shí)現(xiàn),本文使用的是運(yùn)行時(shí)的多態(tài)性,是通過(guò)虛函數(shù)來(lái)實(shí)現(xiàn)的[6]。無(wú)線通信模塊多態(tài)實(shí)現(xiàn)的流程如下:
(1)構(gòu)建無(wú)線通信模塊基類;
(2)構(gòu)建H330類、LC6311+類、SIM5218C類等特定類型的派生類;
(3)聲明無(wú)線通信模塊基類指針;
(4)獲取無(wú)線通信模塊類型;
(5)設(shè)定基類指針指向特定派生類;
(6)業(yè)務(wù)功能類中通過(guò)基類指針來(lái)實(shí)現(xiàn)各派生類的功能。
實(shí)現(xiàn)流程圖如圖6所示。其中基類中實(shí)現(xiàn)的是各種無(wú)線通信模塊都必須用到的而且基本都相同的功能,這些功能都是以虛函數(shù)定義的,在必要的情況下派生類可以以超載的形式實(shí)現(xiàn)各自個(gè)性化的需求。比如在基類中實(shí)現(xiàn)的一個(gè)撥號(hào)虛函數(shù)DialUp()里的內(nèi)容中使用的指令是“ATD”,這個(gè)“ATD”指令適用于多種無(wú)線通信模塊,而MC703無(wú)線通信模塊中使用的撥號(hào)指令為“AT+CDV”,因此在MC703通信模塊的派生類中就必須對(duì)DialUp()進(jìn)行超載。同時(shí)使用虛函數(shù)也是為了在繼承時(shí)實(shí)現(xiàn)運(yùn)行時(shí)的多態(tài)性。
該類中還設(shè)計(jì)了一些純虛函數(shù),純虛函數(shù)是指在基類中只聲明而沒(méi)有定義的虛函數(shù),但要求任何派生類都要定義自己實(shí)現(xiàn)的方法。在基類中實(shí)現(xiàn)純虛函數(shù)的方法是在函數(shù)的原型后加“=0”(例virtual void FunCtion=0;)。這里使用純虛函數(shù)的主要目的是在各個(gè)派生類中規(guī)范出一個(gè)統(tǒng)一的框架結(jié)構(gòu)。
完成基類的設(shè)計(jì),就可以通過(guò)繼承來(lái)實(shí)現(xiàn)各種派生類,派生類中主要是實(shí)現(xiàn)自己的個(gè)性化功能和新的功能,比如上電時(shí)序差異性、初始化設(shè)置的不同等。由于基類中都已經(jīng)定義好了函數(shù)接口,所以派生類中只需在基類的接口上進(jìn)行超載(重寫(xiě)實(shí)現(xiàn)過(guò)程)。為了更好地使用,派生類使用了公有繼承的方式。
通過(guò)上述業(yè)務(wù)軟件框架的設(shè)計(jì),就可以實(shí)現(xiàn)運(yùn)行時(shí)的多態(tài)效果,在設(shè)計(jì)好的無(wú)線通信模塊范圍內(nèi),無(wú)論目前使用的是哪種無(wú)線通信模塊,系統(tǒng)都能在運(yùn)行時(shí)用與之相對(duì)應(yīng)的代碼函數(shù)來(lái)實(shí)現(xiàn)相應(yīng)的功能。還能提供快速添加一款新的無(wú)線通信模塊的功能, 即只需通過(guò)基類繼承出一個(gè)派生類,然后在派生類中實(shí)現(xiàn)自己的個(gè)性化需求即可。
3 總結(jié)
本文涉及了車載移動(dòng)終端智能控制領(lǐng)域,具體介紹了車載移動(dòng)終端自適應(yīng)無(wú)線通信模塊的方法。首先在硬件上設(shè)計(jì)了一款車載終端和不同通信模塊對(duì)接的轉(zhuǎn)接板,通過(guò)綜合分析各種模塊的專用上電時(shí)序后設(shè)計(jì)出了一種通用的上電時(shí)序,并通過(guò)無(wú)線通信模塊本身的PID/VID屬性加AT指令操作的方式進(jìn)行模塊識(shí)別,最后通過(guò)C++多態(tài)的思想,構(gòu)建基類,以基類繼承出各種不同無(wú)線通信模塊的派生類,實(shí)現(xiàn)運(yùn)行時(shí)的多態(tài)功能。通過(guò)該方法成功實(shí)現(xiàn)了一臺(tái)車載移動(dòng)終端自適應(yīng)多種無(wú)線通信模塊的功能,提高了效率,縮短了各種生產(chǎn)和維護(hù)的成本。
參考文獻(xiàn)
[1] 趙晗.現(xiàn)代無(wú)線通信技術(shù)的發(fā)展現(xiàn)狀及未來(lái)發(fā)展趨勢(shì)[J].企業(yè)技術(shù)開(kāi)發(fā),2011,30(16):88-89.
[2] SIMCOM Tech.SIM6320C_hardware design_V1.00[Z].2012.
[3] 武明虎,劉曉靜,陳曉林.基于MC35i模塊的GSM移動(dòng)通信終端的硬件設(shè)計(jì)[J].計(jì)算機(jī)與數(shù)字工程,2010,38(2):152-154.
[4] 劉泉承.基于S3C2440A嵌入式Linux系統(tǒng)USB驅(qū)動(dòng)的研究與應(yīng)用[D].南昌:江西科技師范大學(xué),2012.
[5] SIMCOM Tech.SIMCOM_SIM5218_ATC_EN_V1.07[Z].2011.
[6] 譚浩強(qiáng).C++程序設(shè)計(jì)(第二版)[M].北京:清華大學(xué)出版社,2011.