彭 鵬 章 波
(湖北交通職業(yè)技術(shù)學(xué)院,湖北武漢 430079)
隨著電子和通信技術(shù)的飛速發(fā)展,越來越多的工控和檢測設(shè)備被應(yīng)用在現(xiàn)場,但隨之而來的程序升級和數(shù)據(jù)采集成為限制工控檢測設(shè)備大量應(yīng)用在現(xiàn)場的一個重要因素。基于嵌入式MODEM 的應(yīng)用有著極為廣闊的前景,與通用Modem 相比,嵌入式Modem 具有體積小、易維護(hù)、外圍電路簡單、成本低廉等優(yōu)點,布線安裝僅僅需要普通電話線,連接簡單,可移動性好。同時,由于公用電話網(wǎng)的覆蓋范圍在空間范圍上的優(yōu)越性,可以快速構(gòu)建跨地區(qū)、跨區(qū)域的數(shù)據(jù)采集系統(tǒng)。相對于目前市場上的數(shù)據(jù)采集產(chǎn)品,大多數(shù)需要架設(shè)專門的工業(yè)以太網(wǎng)和現(xiàn)場總線網(wǎng)的情況,基于嵌入式MODEM 的應(yīng)用無疑有著極大的優(yōu)勢,并且它同Internet網(wǎng)的結(jié)合應(yīng)用,更將這種優(yōu)勢推動到了一個新的臺階。
由于篇幅所限,本文主要給出系統(tǒng)的整體設(shè)計思想和軟件詳細(xì)設(shè)計,并給出部分結(jié)果。
由于嵌入式MODEM 多用于現(xiàn)場數(shù)據(jù)采集,安裝的現(xiàn)場環(huán)境有可能比較惡劣,因此在設(shè)計時需要充分考慮到各種干擾。此外采用外接電源的方式會增加系統(tǒng)硬件的體積和成本。
我們都知道,電話線路在掛機(jī)狀態(tài)下兩線間有-48V 的電壓,電流很小,但在摘機(jī)狀態(tài)下兩線間的電壓降到了-12V 左右,電流為20mA 左右,而嵌入式MODEM 最小系統(tǒng)大部分時間都處于待機(jī)狀態(tài),只需要很小的電流就可以維持整個系統(tǒng)的工作。因此,本系統(tǒng)的工作電源可以考慮直接從PSTN線路上進(jìn)行饋電,這樣一來就決定了系統(tǒng)的器件選型都必須基于低功耗進(jìn)行考慮。主控CPU采用的是三菱公司的16位單片機(jī)M30620SFP,該單片機(jī)外部資源豐富,且功耗極低。
系統(tǒng)硬件部分采用PSTN 線路饋電方式進(jìn)行供電,由于很多地方的電話線路還是架空線纜,容易遭受雷擊的影響,因此需要在入口前端增加防雷電路,以增強(qiáng)系統(tǒng)的抗干擾能力。
系統(tǒng)的饋電,以及線路的摘掛機(jī)檢測和數(shù)據(jù)的傳輸都經(jīng)過PSTN 線路,因此線路接口電路相對來說是本系統(tǒng)的最關(guān)鍵部分,也是難點部分。首先需要考慮到線路的饋電能力,還要考慮到極性檢測,振鈴檢測,此外,為了提高數(shù)據(jù)傳輸?shù)姆€(wěn)定性,需對消側(cè)音電路重點進(jìn)行調(diào)試。
為了方便和上位機(jī)進(jìn)行通信,本系統(tǒng)中提供了232串口進(jìn)行連接。由于232電平的高電平為-3V~-12V,低電平為+3V~+12V,不能直接和單片機(jī)的串口進(jìn)行連接,因此需要電平轉(zhuǎn)換電路。此外,為了實現(xiàn)數(shù)據(jù)緩沖,需要增加存儲器,為了方便記錄某些數(shù)據(jù)的采集時間,系統(tǒng)還自帶了實時時鐘。所設(shè)計的嵌入式MODEM 最小硬件系統(tǒng)如圖1所示。
圖1 嵌入式MODEM 最小硬件系統(tǒng)
本系統(tǒng)軟件實現(xiàn)分上呼和下傳兩個方面。上呼就是當(dāng)下位機(jī)采集完數(shù)據(jù)后,定時將數(shù)據(jù)發(fā)送到處于遠(yuǎn)方的主機(jī)服務(wù)器或由上位機(jī)通過命令來控制MODEM 進(jìn)行數(shù)據(jù)上傳,這時就需要先呼叫服務(wù)器號碼,然后進(jìn)行MODEM 協(xié)議的自動識別也就是握手處理,和服務(wù)器側(cè)建立連接后,通過相關(guān)的網(wǎng)絡(luò)協(xié)議將數(shù)據(jù)上傳到服務(wù)器。而下呼則是一個相反的過程,此時的下位機(jī)處于被叫狀態(tài),主機(jī)服務(wù)器通過呼叫下位機(jī)號碼要求下位機(jī)將數(shù)據(jù)上傳。系統(tǒng)的軟件在此需要首先判斷是處于發(fā)起方還是處于應(yīng)答方(MODEM 應(yīng)用里的專業(yè)用語),然后實現(xiàn)鏈路層的自動握手處理,握手通過后,通過TCP/IP 協(xié)議實現(xiàn)數(shù)據(jù)通信。軟件總體設(shè)計框圖如圖2所示。
圖2 軟件總體設(shè)計框圖
當(dāng)嵌入式MODEM 處于閑置狀態(tài)時,最主要的就是進(jìn)行線路狀態(tài)處理,此時主要進(jìn)行上位機(jī)的AT 命令解析,并根據(jù)相應(yīng)的命令來進(jìn)行相關(guān)操作,或者收到服務(wù)器的呼叫進(jìn)行振鈴提示后由上位機(jī)決定是否進(jìn)行摘機(jī)處理。
圖3為線路狀態(tài)處理軟件框圖,ATA 為摘機(jī)應(yīng)答,ATDT 后跟呼叫的號碼為撥號呼叫命令,詳細(xì)的命令請參考AT 命令集里的說明,在此不再贅敘。的通常狀態(tài),上電復(fù)位后進(jìn)入該狀態(tài)。在該狀態(tài)下主要完成下述功能:
圖3 線路狀態(tài)處理
檢測是否有主機(jī)命令下達(dá);檢測是否有振鈴產(chǎn)生;分析主機(jī)命令,進(jìn)行必要的設(shè)置;根據(jù)主機(jī)的摘機(jī)撥號命令進(jìn)入主叫狀態(tài);或在檢測到振鈴后反饋給主機(jī)后在主機(jī)命令控制下進(jìn)入MODEM 協(xié)議握手處理。
圖3中,在收到主機(jī)摘機(jī)撥號的命令進(jìn)入主叫狀態(tài),在該狀態(tài)下主要完成下述功能:按照要求摘機(jī);檢測線路狀態(tài);檢測信號音,如果有忙音,反饋主機(jī);如果撥號音正常,用DTMF撥號;撥號后檢測線路狀態(tài),是否是回鈴音或忙音;如為忙音,通知主機(jī)并掛機(jī);如回鈴音則等待線路是否出現(xiàn)反極信號,超時退出該狀態(tài);有反極則進(jìn)入MODEM 協(xié)議握手處理。
在嵌入式MODEM 里,采用的是V.32bis的協(xié)議,它的速率可以達(dá)到14.4KBPS,全雙工工作。由于CMX869對V.32BIS等協(xié)議已經(jīng)進(jìn)行了自動封裝,對MODEM 握手處理主要是對其相關(guān)寄存器進(jìn)行設(shè)置和檢測。握手處理的程序如下:
對TCP/IP 協(xié)議族的實現(xiàn),采用的是從網(wǎng)上移植的uIP協(xié)議,uIP是一個適用于8/16位機(jī)上的小型嵌入式TCP/IP協(xié)議棧,簡單易用,資源占用少是它的設(shè)計特點。它去掉了許多全功能協(xié)議棧中不常用的功能,而保留網(wǎng)絡(luò)通信所必要的協(xié)議機(jī)制。其設(shè)計重點放在IP、ICMP和TCP協(xié)議的實現(xiàn)上,將這三個模塊合為一個有機(jī)的整體,而將UDP和ARP協(xié)議實現(xiàn)作為可選模塊。
為了節(jié)省資源占用,簡化應(yīng)用接口,uIP在內(nèi)部實現(xiàn)上作了特殊的處理。①注意各模塊的融合,減少處理函數(shù)的個數(shù)和調(diào)用次數(shù),提高代碼復(fù)用率,以減少ROM 占用。②基于單一全局?jǐn)?shù)組的收發(fā)數(shù)據(jù)緩沖區(qū),不支持內(nèi)存動態(tài)分配,由應(yīng)用負(fù)責(zé)處理收發(fā)的數(shù)據(jù)。③基于事件驅(qū)動的應(yīng)用程序接口,各并發(fā)連接采用輪循處理,僅當(dāng)網(wǎng)絡(luò)事件發(fā)生時,由uIP 內(nèi)核喚起應(yīng)用程序處理。這樣,uIP用戶只須關(guān)注特定應(yīng)用就可以了。傳統(tǒng)的TCP/IP實現(xiàn)一般要基于多任務(wù)處理環(huán)境,而大多數(shù)8位機(jī)系統(tǒng)不具備這個條件。④應(yīng)用程序主動參與部分協(xié)議棧功能的實現(xiàn)(如TCP的重發(fā)機(jī)制,數(shù)據(jù)包分段和流量控制),由uIP 內(nèi)核設(shè)置重發(fā)事件,應(yīng)用程序重新生成數(shù)據(jù)提交發(fā)送,免去了大量內(nèi)部緩存的占用?;谑录?qū)動的應(yīng)用接口使得這些實現(xiàn)較為簡單。
(1)uIP的接口技術(shù)
uIP可以看作是一個代碼庫為系統(tǒng)提供確定的函數(shù)。圖1 展示了uIP,系統(tǒng)底層和應(yīng)用程序之間的關(guān)系。uIP提供三個函數(shù)到系統(tǒng)底層,uip_init(),uip_input(),和uip_periodic()。應(yīng)用程序必須提供一個回應(yīng)函數(shù)給uIP。當(dāng)網(wǎng)絡(luò)或定時事件發(fā)生時,調(diào)用回應(yīng)函數(shù)。uIP 提供許多函數(shù)和堆棧交互。
圖4 uIP庫
(2)uIP應(yīng)用接口
uIP使用一個基于編程模塊的事件,模塊是實現(xiàn)應(yīng)用程序作為一個C 函數(shù)被uIP 調(diào)用的地方,uIP響應(yīng)一定的事件。uIP 調(diào)用應(yīng)用在,當(dāng)接收數(shù)據(jù)時,當(dāng)數(shù)據(jù)成功送達(dá)另一方中止連接時,當(dāng)一個新的連接建立時,或者當(dāng)數(shù)據(jù)需要重發(fā)時。應(yīng)用程序也周期性地循環(huán)等待新數(shù)據(jù)。應(yīng)用程序只提供一個回應(yīng)函數(shù);它提升了應(yīng)用程序處理不同的網(wǎng)絡(luò)服務(wù)的不同的端口和連接的映射。
uIP與其它TCP/IP 棧不同的是,當(dāng)正在重發(fā)工作,它需要應(yīng)用程序的幫助。其它TCP/IP棧緩存?zhèn)鬏敂?shù)據(jù)在儲存器里,直到在連接的最后數(shù)據(jù)確應(yīng)成功發(fā)送。如果數(shù)據(jù)需要重傳,堆棧在沒有通知應(yīng)用程序下監(jiān)視著重傳工作。通過這種方法,當(dāng)要等待一個確應(yīng),數(shù)據(jù)必須緩存在儲存器里,如果產(chǎn)生一個重發(fā),應(yīng)用程序可以快速重新生成數(shù)據(jù)。為了減少儲存器的使用量,uIP 利用的論據(jù)是應(yīng)用程序可以重新生成發(fā)送的數(shù)據(jù)和讓應(yīng)用程序參加重發(fā)。
(3)uIP系統(tǒng)接口
從系統(tǒng)的立場看,uIP 由3 個C 函數(shù)uip_init(),uip_input(),和ip_periodic()。uip_init()函數(shù)用于初始化uIP 堆棧和在系統(tǒng)啟動期間調(diào)用。當(dāng)網(wǎng)絡(luò)設(shè)備驅(qū)動器讀一個IP包到包緩存時,調(diào)用函數(shù)uip_input()。周期性運行是調(diào)用uip_periodic(),代表的是一秒一次。調(diào)用uIP函數(shù)是系統(tǒng)的職責(zé)。
為了驗證系統(tǒng)的軟件,需要搭建一個硬件測試環(huán)境,采用兩臺PC 機(jī),其中一臺PC 機(jī)通過串口和嵌入式MODEM 的串口連接,另一臺PC 機(jī)的串口和商用 MODEM (型號為 TM-EC5658V)的串口連接,兩個MODEM 的線路接口都各自接入一條內(nèi)線電話線路(辦公電話需要加撥4才能撥號外線),軟件測試環(huán)境都是基于超級終端下進(jìn)行,超級終端的通信波特率設(shè)置為19200bps,8位數(shù)據(jù)位,無效驗方式。
首先進(jìn)行MODEM V.32bis協(xié)議下的數(shù)據(jù)傳輸。在商用MODEM 下發(fā)送AT 命令“AT+MS=V32B”,將商用MODEM 的通信協(xié)議固定為V.32BIS協(xié)議后,發(fā)送“ATD4,87403039”命令呼叫嵌入式MODEM 的線路號碼,呼叫建立后,嵌入式MODEM 線路上并聯(lián)的話機(jī)開始振鈴,并且每振鈴一次,嵌入式MODEM 將相應(yīng)的振鈴信息發(fā)送到串口,如圖5所示,此時輸入摘機(jī)命令“ATA”進(jìn)行摘機(jī)握手處理,嵌入式MODEM很快就和商用MODEM 握手成功,將相應(yīng)的測試信息“CONNECT 19200”發(fā)送到串口,此時在商用MODEM 的超級終端界面上發(fā)送一串?dāng)?shù)據(jù),嵌入式MODEM 能正確接收。然后采用MODEM的文件傳輸協(xié)議進(jìn)行大文件傳輸,方法和上面一樣,唯一不同的是握手成功后,不是直接發(fā)送數(shù)據(jù),而是在商用MODEM 的超級終端界面下選擇發(fā)送文件,采用Ymodem 協(xié)議發(fā)送文件進(jìn)行大數(shù)據(jù)量傳輸,初步測試時,接收數(shù)據(jù)時有丟失字節(jié)的現(xiàn)象,針對該問題對軟件部分進(jìn)行了完善,修改主要針對V.32BIS協(xié)議,因為在此協(xié)議下,線路靈敏度很高,經(jīng)常會收到誤碼,所以在修改時,軟件部分將線路接收部分的優(yōu)先級別提高,將數(shù)據(jù)緩沖區(qū)加大;同時將硬件接收電路部分的增益降低。進(jìn)行幾百K 的文件傳輸時通訊正常。發(fā)送“++++++++”命令退出鏈接。
圖5 V.32bis協(xié)議下通訊測試
驗證TCP/IP 協(xié)議也是在上面的測試環(huán)境下進(jìn)行的。通過接撥武漢熱線號碼,握手通過,軟件通過PPP協(xié)議發(fā)送用戶名和密碼,成功登錄網(wǎng)絡(luò),測試界面如圖6所示。登錄成功后,顯示嵌入式MODEM 的IP地址為“202.110.140.70”。
圖6 TCP/IP協(xié)議測試界面
通過以上各項測試結(jié)果,嵌入式MODEM 的軟硬件設(shè)計基本上達(dá)到了預(yù)期設(shè)定的目標(biāo),該系統(tǒng)適用于遠(yuǎn)程監(jiān)控系統(tǒng)和工業(yè)測控系統(tǒng),現(xiàn)場僅僅只需要有電話線路接入,就可以完成供電和通訊,特別適合于某些無人值守的現(xiàn)場使用,給遠(yuǎn)程數(shù)據(jù)采集帶來了很大的方便。
本文對嵌入式MDOEM 的最小系統(tǒng)的實現(xiàn)進(jìn)行了全面的介紹,對其相關(guān)硬件設(shè)計和軟件實現(xiàn)進(jìn)行了詳細(xì)介紹,最終的最小系統(tǒng)的實現(xiàn)基本達(dá)到了預(yù)期設(shè)計,并且在軟硬件聯(lián)調(diào)過程和實際試驗時,對相關(guān)的硬件電路參數(shù)進(jìn)行了改進(jìn),使得嵌入式MODEM 的工作性能更加穩(wěn)定。
硬件調(diào)試部分的難點在于提高通信的穩(wěn)定性,也就是硬件電路中的消側(cè)音和增益控制部分,對此部分電路先是在ORCAD 軟件下進(jìn)行了仿真測試,并結(jié)合實際測試情況對其進(jìn)行了完善,目前在嵌入式MODEM 和另一臺商用MODEM 之間進(jìn)行MODEM 協(xié)議下的文件傳輸,通信正常,沒有出現(xiàn)誤碼現(xiàn)象。
對網(wǎng)絡(luò)協(xié)議部分軟件的實現(xiàn),軟件程序的編寫都是基于三菱M16C60的編譯器NC30WA 下進(jìn)行的,調(diào)試過程中也發(fā)現(xiàn)了三菱編譯器的一個BUG,就是注釋部分不能用“/*…..*/”進(jìn)行注釋,而只能用“//…..//”來進(jìn)行注釋。
1 陳連刊.嵌入式系統(tǒng)的設(shè)計與開發(fā)[M].清華大學(xué)出版社,2005
2 謬湘科等.Linux管理與開發(fā)指南[M].人民郵電出版社,1999