80C196KB與PC機(jī)之間的遠(yuǎn)程通訊系統(tǒng)設(shè)計(jì)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
在許多實(shí)時(shí)監(jiān)測系統(tǒng)中,經(jīng)常需要接收距離較遠(yuǎn)的測控點(diǎn)數(shù)據(jù),如何快速可靠的實(shí)現(xiàn)數(shù)據(jù)的遠(yuǎn)程傳輸是這些監(jiān)測系統(tǒng)必須解決的問題。在監(jiān)測現(xiàn)場,為了降低系統(tǒng)的成本,往往采用單片機(jī)系統(tǒng)作為數(shù)據(jù)采集和記錄單元;在中央控制中心,常常利用PC機(jī)來完成人機(jī)會話及與監(jiān)測現(xiàn)場的通信。數(shù)據(jù)的遠(yuǎn)程傳輸目前經(jīng)常用調(diào)制解調(diào)器(Modem)通過電話線來進(jìn)行。本文將介紹一套實(shí)用的主從式遠(yuǎn)程通記系統(tǒng)。其下位機(jī)由16位單片機(jī)80C196KB承提,上位機(jī)的管理平臺則基于界面友好、功能強(qiáng)大的Visual Basic 6.0。
1 80C196與PC間的通訊方式
用80C196KB單片機(jī)的串行接口和調(diào)制解調(diào)器以及現(xiàn)有的電話線來實(shí)現(xiàn)遠(yuǎn)程雙向通訊的系統(tǒng)方框圖如圖1所示。
在利用現(xiàn)有電話線進(jìn)行數(shù)據(jù)傳輸?shù)拇型ㄓ崟r(shí),必須把將要傳送的數(shù)據(jù)按先后順序,在公共信道上逐位傳送。
串行通訊對字符編碼、字符格式和傳輸速度都有具體規(guī)定,必須嚴(yán)格遵守。
異步串行通訊數(shù)據(jù)的傳送格式由四部分組成,即起始位、數(shù)據(jù)位、奇偶校驗(yàn)位和終止位。通訊協(xié)議要求在發(fā)送端每傳送一個(gè)字符都必須要有起始位、數(shù)據(jù)位、奇偶校驗(yàn)位和一個(gè)終止位的字符串;而在接收端,也要按照起始位、數(shù)據(jù)位、奇偶校驗(yàn)位和一個(gè)終止位的字符串進(jìn)行計(jì)數(shù)接收。
2 80C196KB與Modem間的接口
RS-232C的標(biāo)準(zhǔn)規(guī)定,邏輯“0”表示其電位應(yīng)在+5~+15V之間,邏輯“1”表示其電位應(yīng)在-5~-15V之間,而80C196KB單片機(jī)串口電閏為TTL電平,因此必須要通過電平轉(zhuǎn)換才能符合串行通訊標(biāo)準(zhǔn)。具體的接口電路如圖2所示。
電路中采用IN-TERSIL公司生產(chǎn)的只需+5V供電的串行收/發(fā)驅(qū)動器芯片ICL232來進(jìn)行電平的轉(zhuǎn)換和驅(qū)動。當(dāng)終端(196KB)處于操作規(guī)程狀態(tài)并可接收數(shù)據(jù)時(shí),為了能將此信息傳送給MODEM,則必須使用管腳4上的數(shù)據(jù)終端就緒(DTR)信號;同樣地,為使終端設(shè)備(196KB)能夠?qū)?shù)據(jù)傳輸?shù)男畔⑼ㄖ{(diào)制解調(diào)器,就必須使用管腳7上的請求發(fā)送(RTS)信號。
由圖2可見,單片機(jī)DB(9芯)只給調(diào)制解調(diào)器的RS-232接口(9芯)提供三條信號線,即發(fā)送數(shù)據(jù)(TXD)、接收數(shù)據(jù)(RXD)和信號地SG。為了使數(shù)據(jù)鏈路能正常工作,可將調(diào)制解調(diào)器RS-232接口的4腳(DTR)和7腳(RTS)置高,以使之長期有效。
表1列出了RS-232的管腳及描述。表中的DTE為數(shù)據(jù)終端設(shè)備(Data Terminal Equipment)。本文中指下位機(jī)80C196KB和上位機(jī)PC,而DCE則表示數(shù)據(jù)通信設(shè)備(Data Communication Equipment)。本文中指調(diào)制解調(diào)器。
表1 RS-232各引腳描述
3 波特率設(shè)置
為了實(shí)現(xiàn)與遠(yuǎn)方中央控制計(jì)算機(jī)正確可靠地通訊,雙方波特率必須一致。考慮到所選信道為公用電話網(wǎng),為兼顧數(shù)據(jù)傳輸?shù)母咚傩院涂煽啃裕闹袑⒉ㄌ芈识?600bps。
3.1 下位機(jī)部分
80C196KB串行口的波特率取決于16位波特率寄存器的內(nèi)容。該寄存器應(yīng)以連續(xù)2個(gè)字節(jié)進(jìn)行裝載,低位字節(jié)優(yōu)先。寄存器的最高位用于選擇波特率發(fā)生器的輸入時(shí)鐘源,最高位為1,選用XTAL1(即晶體振蕩器)信號為源信號,否則選用自T2CLK引腳的信號為源信號。
80C196KB 的內(nèi)部時(shí)鐘信號是經(jīng)2分頻獲得的。若以BAUD-REG表示波特率寄存器的裝載值,那么在同步模式0時(shí),BUAD-REG=XTAL1/(2×波特率)- 1或T2CLK/波特率;而在異步模式1、2和3時(shí),其BAUD-REG=XTAL1/(16×波特率)-1或T2CLK/(8×波特率)。
80C196KB的通信方式設(shè)定為異步方式1時(shí),可進(jìn)行全雙工通訊,其格式為每10位構(gòu)成一串行幀,其中包括1位起始位,8位數(shù)據(jù)位和1位停止位。
在本系統(tǒng)中,80C196KB的晶振為12MHz,因此,為使波特率達(dá)到9600,需將波特率寄存器賦值為804EH。
表2列出了采用XTAL1作為時(shí)鐘源時(shí),異步模式下一些常用波特率所對應(yīng)的波特率寄存器值。應(yīng)注意,表中所列的值是根據(jù)上述公式計(jì)算所得的值再加上最高位“1”后得到的。
表2 常用波特率對應(yīng)的波特率寄存器值
3.2 上位機(jī)部分
微機(jī)數(shù)據(jù)采集系統(tǒng)中的一個(gè)關(guān)鍵問題是要在Windows環(huán)境下編寫相應(yīng)的通信程序。Windows應(yīng)用編程接口(API)所提供的有關(guān)串行通訊的16個(gè)函數(shù)可以實(shí)現(xiàn)完整的通訊功能,但其應(yīng)用較為復(fù)雜。而VB中有一個(gè)通訊控件MSComm,通過改變其屬性設(shè)置和編寫相應(yīng)的程序,就能在Windows環(huán)境下方便地實(shí)現(xiàn)不同用戶的串行通訊要求。
利用下面的語句可以方便地設(shè)置傳輸波特率,MSComm1.Settings=“9600,N,8,1”
表明波特率為9600,無奇偶校驗(yàn)位,8位數(shù)據(jù)位,1位停止位。
4 80C196KB和中央控制機(jī)的通訊
在本系統(tǒng)中,下位機(jī)為主叫端,上位機(jī)為應(yīng)答端,它們通過公用電話網(wǎng)進(jìn)行數(shù)據(jù)傳輸。其數(shù)據(jù)鏈路的建立、數(shù)據(jù)傳輸及結(jié)束通信的全過程如表3所列。
表3 數(shù)據(jù)傳輸過程表
調(diào)制解調(diào)器安裝好后,必須預(yù)先設(shè)置好調(diào)制解調(diào)器的初始狀態(tài),然后再開通。否則通訊將不會成功。用戶對Modem初始化狀態(tài)的設(shè)置可以保存在非易失性RAM中。
下面對表3所列的傳輸過程進(jìn)行說明。
(1)在握手初期,兩端的DTE需對Modem進(jìn)行復(fù)位操作。為此,它們先給本端的Modem發(fā)ATZ命令。若Modem能執(zhí)行重設(shè)操作,便會返回結(jié)果碼OK,若Modem尚未與電話線連接,便返回NO DIALTONE,表示沒有撥號音。
(2)兩端DTE給各自的Modem發(fā)AT&F命令,調(diào)入Modem出廠缺省設(shè)置。
(3)主叫端DTE(196KB)向應(yīng)答端Modem發(fā)撥號命令A(yù)TDT xxxx(ATDT表示音頻撥號,xxxx為對端的電話號碼)。當(dāng)對端Modem檢測到振鈴(RING)后,由PC機(jī)控制并回送應(yīng)答呼叫命令A(yù)TA。如果話路正常,則在一定的延時(shí)后,兩端Modem收到結(jié)果碼CONNECT 9600,并使Modem的CD指示燈亮,以表明數(shù)據(jù)傳輸鏈路成功建立。
(4)數(shù)據(jù)傳輸。
(5)數(shù)據(jù)通訊完成后,雙方Modem要拆鏈掛機(jī)。“+ + +”命令是由數(shù)據(jù)傳輸狀態(tài)轉(zhuǎn)為命令狀態(tài)的AT指令,它的前后必須有一段時(shí)間延時(shí)。當(dāng)Modem狀態(tài)變?yōu)槊顮顟B(tài)時(shí),可以用命令A(yù)TH來實(shí)現(xiàn)掛機(jī)。至此,兩臺Modem間的通訊任務(wù)就完成了。此時(shí)PC機(jī)內(nèi)已存放了主機(jī)傳來的數(shù)據(jù),將這些數(shù)據(jù)存入數(shù)據(jù)庫后可作進(jìn)一步的處理。
5 數(shù)據(jù)傳輸?shù)牧髁靠刂坪蛡慑e(cuò)糾錯(cuò)
當(dāng)兩端Modem正確可靠地建立起數(shù)據(jù)鏈路后就可以進(jìn)行數(shù)據(jù)通訊了。在通過電話系統(tǒng)傳輸數(shù)據(jù)時(shí),沒有一種簡單的方法能確保數(shù)據(jù)正確完整地到達(dá)對方。數(shù)據(jù)錯(cuò)誤的發(fā)生可能有多種原因。由于串行通訊時(shí)數(shù)據(jù)是逐位發(fā)送的,因此即使極小的噪聲都有可能在多個(gè)位上造成嚴(yán)重錯(cuò)誤,當(dāng)波特率較高時(shí)出現(xiàn)錯(cuò)誤更嚴(yán)重。在實(shí)際應(yīng)用,常采用XMODEM協(xié)議對數(shù)據(jù)進(jìn)行打包處理以檢測傳輸過程中出現(xiàn)的錯(cuò)誤,若檢測到錯(cuò)誤信息,則要求重傳出現(xiàn)錯(cuò)誤的數(shù)據(jù)信息。理論上講如果每個(gè)數(shù)據(jù)包都能正確地傳送,那么整個(gè)數(shù)據(jù)塊也將成功地傳送。XMODEM協(xié)議按照一套特定的準(zhǔn)則控制著數(shù)據(jù)傳輸?shù)乃屑?xì)節(jié),其中包括如何啟動傳輸、包的大小、包的內(nèi)容、正負(fù)應(yīng)答以及如何完成傳輸?shù)取?/p>
XMODEM協(xié)議雖然較為成熟和完美,全過于復(fù)雜。本系統(tǒng)借鑒XMODEM協(xié)議的設(shè)計(jì)思想,并針對現(xiàn)場監(jiān)控?cái)?shù)據(jù)的特點(diǎn),設(shè)計(jì)了一套簡潔的流控和偵錯(cuò)協(xié)議。從本系統(tǒng)的實(shí)際運(yùn)行情況來看,該協(xié)議可保證數(shù)據(jù)的可靠傳輸,并能在話路質(zhì)量較差時(shí)多次重發(fā)出錯(cuò)的數(shù)據(jù)幀直到數(shù)據(jù)傳輸正確為止。
圖3為上位機(jī)通信子程序的流程圖,它主要利用VB6.0的通訊控件MSComm的ON COMM事件。
本系統(tǒng)在每次通信中,由80C196KB送給PC機(jī)的有效數(shù)據(jù)幀共4320幀,每幀113字節(jié)。其中有效字節(jié)112個(gè),以3個(gè)FFH開頭,最后1個(gè)字節(jié)為異或結(jié)果,可用于傳輸后的異或校驗(yàn)。在發(fā)送有效數(shù)據(jù)幀之前,下位機(jī)先發(fā)一個(gè)請求幀(仍為113字節(jié)),其幀結(jié)構(gòu)為112個(gè)F0H加一異或結(jié)果。上位機(jī)收到該幀請求信號后,將回送握手成功信號,并作好接收有效數(shù)據(jù)的準(zhǔn)備。下位機(jī)收到上位機(jī)發(fā)回的握手成功信號后,便將有效數(shù)據(jù)幀逐幀發(fā)送。
上位機(jī)對每幀數(shù)據(jù)的均要作異或校驗(yàn)。如有錯(cuò)誤的則回送失敗信號,并要求下位機(jī)重發(fā);正確的則放入緩沖數(shù)組以備存庫,并回送成功信號。當(dāng)有效數(shù)據(jù)幀發(fā)送完畢后,下位機(jī)將發(fā)一個(gè)結(jié)束幀,其幀結(jié)構(gòu)為112個(gè)FCH加一個(gè)異或結(jié)果。上位機(jī)收到該幀結(jié)束信號后,發(fā)出AT命令“+ + +ATH”以拆鏈掛機(jī)。至此,數(shù)據(jù)通信過程結(jié)束,之后,上位機(jī)將緩沖數(shù)組里數(shù)據(jù)存入數(shù)據(jù)庫,以便日后進(jìn)行數(shù)據(jù)分析。
6 結(jié)束語
利用公用電話網(wǎng),80C196KB單片機(jī)系統(tǒng)可通過Modem與遠(yuǎn)方監(jiān)控中心進(jìn)行通訊。這種系統(tǒng)的軟硬件設(shè)計(jì)方案簡單可行,運(yùn)行成本低,數(shù)據(jù)傳輸速率較高。本監(jiān)控系統(tǒng)已在現(xiàn)場投入使用,經(jīng)受了實(shí)際考驗(yàn)??赏茝V應(yīng)用于各類遠(yuǎn)程通訊系統(tǒng)。