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