李東岳,邢傳義
(哈爾濱威克科技股份有限公司,黑龍江哈爾濱150090)
把無線通信和串行通信結(jié)合起來,在鐵路與其他行業(yè)中有著極其廣泛的應用,可以進行遠程數(shù)據(jù)采集、處理與控制。文章介紹的是服務器與單片機系統(tǒng),通過數(shù)傳電臺,實現(xiàn)串行主從式通信的實例。上位機使用RS-232串口,連接數(shù)傳電臺,數(shù)傳電臺用的是MOTOROLA公司的GM950i,下位機硬件主要有89C51單片機及串口電路等,串口電路采用MAX232芯片。
在無線通信過程中,會產(chǎn)生一系列的不同于有線通信的問題,主要是無線通信中的干擾,無線電臺在發(fā)送數(shù)據(jù)的時候,自身會產(chǎn)生一些亂碼,在對數(shù)據(jù)處理的時候,還要有對從機的識別與區(qū)分。這些都要通過制定必要的通訊協(xié)議來解決。所以要編寫相應的發(fā)送程序和接受程序,增強系統(tǒng)對誤碼的判斷能力,提高程序?qū)?shù)據(jù)傳輸?shù)目煽啃浴?/p>
串行端口的本質(zhì)功能是作為CPU和串行設備間的編碼轉(zhuǎn)換器。當數(shù)據(jù)從CPU經(jīng)過串行端口發(fā)送出去時,字節(jié)數(shù)據(jù)轉(zhuǎn)換為串行的位。在接收數(shù)據(jù)時,串行的位被轉(zhuǎn)換為字節(jié)數(shù)據(jù)。數(shù)傳電臺是本通信系統(tǒng)中重要的通信媒介,起到微波發(fā)送與接收的作用,它有一個RS232接口,直接與上位機的串口連接,它們之間通過四線制(RX、TX、SG、RTS)連接。在收發(fā)數(shù)據(jù)的時候,程序要合理地控制RTS信號線。
本通信系統(tǒng)是半雙工的,一次只能同一個終端設備進行數(shù)據(jù)交換。所以就有資源沖突問題,要通過時序的協(xié)調(diào)來解決。網(wǎng)絡的控制權集中在中心主機上,主機以順序查詢的方式與從機進行通訊,從機是被動地接收或發(fā)送數(shù)據(jù),其功能可通過通信協(xié)議來實現(xiàn)。為了解決單片機緩沖區(qū)小的問題,本程序采用了多次發(fā)送,多次接收,一次處理的方法,使單片機可以通過協(xié)議收發(fā)多組數(shù)據(jù)。對于數(shù)傳電臺傳輸過程中的干擾問題,也有相對的解決方案。經(jīng)試驗發(fā)現(xiàn),干擾產(chǎn)生的亂碼集中在RTS發(fā)生變化的時候,也就是說,大部分亂碼出現(xiàn)在數(shù)據(jù)的首尾,于是本程序利用亂碼出現(xiàn)頻率較低的OAAH和55H作為前導碼。接收程序在判斷到這兩個數(shù)據(jù)之后才對協(xié)議中的控制字、地址等進行判斷??刂谱侄x了按協(xié)議寫的數(shù)組的長度,所以后續(xù)的亂碼就不用去處理了,從而實現(xiàn)了先判斷后處理。實驗證明,此方案可行。通信連接示意圖如圖1所示。
表1 協(xié)議構(gòu)成
幀頭(24位)就是前導碼。制定無線通信協(xié)議的第一任務就是要能夠正確識別數(shù)據(jù)。傳送過程中的干擾噪聲和有效數(shù)據(jù)干擾噪聲是以隨機字節(jié)形式出現(xiàn)的,沒有明顯的表示規(guī)律。通過測試發(fā)現(xiàn),0AAH和55H比較合適。
從機地址的范圍為1到254,所以一次最多可以連254個從機。0作為廣播式通信時主機發(fā)送的地址信號。255保留。
控制字有8位。D7表示數(shù)據(jù)來源,1為主機,0為從機。D6表示傳送方式,1主從式,0廣播式。D5D4D3是控制字,000表示準備好了嗎/準備好了;001表示請求子機發(fā)送數(shù)據(jù)/子機發(fā)送數(shù)據(jù);010表示子機發(fā)送的是最后一組數(shù)據(jù);100表示是主機發(fā)送數(shù)據(jù);101代表主機發(fā)送結(jié)束。D2D1D0標志著數(shù)據(jù)位的長度,000~111依次表示傳送0~8個字節(jié)數(shù)據(jù)。數(shù)據(jù)位可根據(jù)需要取相應字節(jié)數(shù),按十六進制傳送;校驗位采用CRC校驗碼。
上位機通信程序用VB編寫,通信流程圖如圖2。下位機用匯編語言編寫,通信流程圖如圖3。除了遵守通信協(xié)議之外,還要遵守相應的硬件規(guī)約。發(fā)送的每個字節(jié)數(shù)據(jù)都是10位,包括1個起始位、1個停止位、8個數(shù)據(jù)位。通信波特率為4 800bit/s。
4.2.1 發(fā)送程序
發(fā)送數(shù)據(jù)的關鍵問題是一次傳送的字節(jié)數(shù),由于單片機緩沖區(qū)一次只能放一個字節(jié)的數(shù)據(jù)。而按照協(xié)議發(fā)送的字節(jié)數(shù)組很長,所以本程序用了如下方法實現(xiàn)收發(fā):
(1)將要發(fā)送的數(shù)據(jù)按照協(xié)議放入一個字節(jié)數(shù)組中,例如:要發(fā)送數(shù)據(jù)7給從機1,數(shù)據(jù)幀F(xiàn)F AA 55 01 E1 07,校驗位在本演示程序未寫入,放在SendData字節(jié)數(shù)組中SendData(0)=0FFH,SendData(1)=0AAH,以此類推。
(2)將字節(jié)數(shù)組中的數(shù)據(jù)發(fā)送出去,每個中間間隔40ms,從SendData(0)依次發(fā)到SendData(5),中間經(jīng)過一個過度數(shù)組out(),是一個能放一字節(jié)數(shù)據(jù)的定長數(shù)組。
發(fā)送程序如下:
4.2.2 接收程序
由于發(fā)送時間間隔是40ms,本程序采用事件驅(qū)動接收,就是緩沖區(qū)每有一個字節(jié)的數(shù)據(jù)就觸發(fā)Oncomm事件,將緩沖區(qū)數(shù)據(jù)取入數(shù)組中,可以在六個數(shù)據(jù)都取完了之后再處理。如何知道數(shù)據(jù)發(fā)送結(jié)束呢?在這里,利用發(fā)送時間間隔為40ms這個特點,可以把每組數(shù)據(jù)時間間隔設長一點。第一次觸發(fā),用時鐘記時,第二次觸發(fā),時鐘清零,再開始記時,然后對接收到的數(shù)組處理。接收數(shù)據(jù)的接收過程利用的是Oncomm事件和Timer3定時器。
下位機通信程序的收發(fā)功能與上位機類似,發(fā)送的時序和時間間隔都按照本通信協(xié)議,只是使用匯編語言編寫,本程序只對程序發(fā)送數(shù)據(jù)做簡單描述。
實驗證明,該方法及其通信協(xié)議能很好地實現(xiàn)數(shù)據(jù)的接收和發(fā)送,數(shù)據(jù)收發(fā)準確率較高;不足之處在于數(shù)據(jù)傳輸速度相對比較慢,因此適合于對數(shù)據(jù)傳輸速度要求不高,數(shù)據(jù)量不多的場合。在鐵路通訊中,由于部分區(qū)段無法進行有線通訊,無線通信是很好的解決方法。目前越來越多的智能儀器采用通用的RS232接口加數(shù)傳電臺方式實現(xiàn)通信和控制。文章的方法可以很好地解決這一問題。
[1]李華.單片機原理及應用[M].蘭州:蘭州大學出版社,2001.
[2]范逸之.利用實現(xiàn)串并行通信技術[M].北京:清華大學出版社,2001.
[3]李鴻吉.Visual Basic 6.0中文版編程方法詳解[M].北京:科學出版社,2001.(編輯:鐘 媛)