UART0串口编程(一):通信协议设计;RS232标准
UART0串口編程(一)
嵌入式系統(tǒng)之間采用通信方式交換數(shù)據(jù),串行通信是一種最基本的通信手段。現(xiàn)在由于各類CPU均集成了UART部件。本節(jié)對串口編程時如何設(shè)計串口通信協(xié)議,以及對RS232接口進(jìn)行了說明。
1.????通信協(xié)議設(shè)計
在進(jìn)行通信時,每次需要傳送的信息一般超過1字節(jié)。為此,通信雙方必須約定通信數(shù)據(jù)的排列格式,即通信協(xié)議。通常把一次通信過程的全部內(nèi)容稱為一個“通信幀”。通信協(xié)議設(shè)計就是幀結(jié)構(gòu)設(shè)計。在一幀內(nèi)容中,通常包括以下部分。
(1)起始碼:由一個或若干個包含特定內(nèi)容的字節(jié),表示一個通信幀的開始。起始碼的內(nèi)容必須與通信數(shù)據(jù)內(nèi)容有明顯區(qū)別(不能在通信數(shù)據(jù)里出現(xiàn)與起始碼相同的內(nèi)容)。當(dāng)通信幀的總長度比較短,信道質(zhì)量比較高時,為了提高效率,可以不設(shè)置起始碼。
(2)地址碼:在主從結(jié)構(gòu)的多機組網(wǎng)通信系統(tǒng)中,用來指明分機號。
當(dāng)分機總數(shù)在255臺之內(nèi)時,地址碼為1字節(jié)。可以定義一個特殊的地址碼作為廣播地址,代表所有的分機。在多主多從(無主從)結(jié)構(gòu)的多機組網(wǎng)通信系統(tǒng)中,地址碼包含收發(fā)雙方的地址。如果是兩臺設(shè)備之間進(jìn)行點對點的通信,幀結(jié)構(gòu)中就步需要包含地址碼。
(3)長度碼:在數(shù)據(jù)長度不固定的通信場合(變長幀),表示本幀數(shù)據(jù)內(nèi)容的字節(jié)數(shù)。當(dāng)長度肯定不超過255字節(jié)時,長度碼用1字節(jié)表示。如果每次通信數(shù)據(jù)內(nèi)容的長度為雙方約定的固定值(定長幀),幀結(jié)構(gòu)中就不需要包含長度碼。
(4)數(shù)據(jù)段:通信的實質(zhì)內(nèi)容。
(5)校驗碼:由于通信信道存在干擾,為了判斷接收的內(nèi)容是否受到干擾,需要加入效驗碼。
效驗碼算法可以采用
1)簡單的異或校驗碼。
2)也可以像HEX文件那樣采用算術(shù)加法校驗。
3)采用功能極強的CRC校驗。
注:當(dāng)通信環(huán)境非常好時(如室內(nèi)設(shè)備之間的通信),幀結(jié)構(gòu)中就不需要包含校驗碼。
2.????RS232標(biāo)準(zhǔn)
(1)簡介:
RS232接口是1970年由美國電子工業(yè)協(xié)會(EIA)聯(lián)合貝爾系統(tǒng)、調(diào)制解調(diào)器廠家及計算機終端生產(chǎn)廠家共同制定的用于串行通訊的標(biāo)準(zhǔn)。它的全名是“數(shù)據(jù)終端設(shè)備(DTE)和數(shù)據(jù)通訊設(shè)備(DCE)之間串行二進(jìn)制數(shù)據(jù)交換接口技術(shù)標(biāo)準(zhǔn)”。該標(biāo)準(zhǔn)規(guī)定采用一個25個腳的DB25連接器,對連接器的每個引腳的信號內(nèi)容加以規(guī)定,還對各種信號的電平加以規(guī)定。隨著設(shè)備的不斷改進(jìn),出現(xiàn)了代替DB25的DB9接口,現(xiàn)在都把RS232接口叫做DB9
注:我們后面所用的都是RS232的DB9接口
(2)接口定義如下圖:
引腳1:DCD?載波檢測
引腳2:RXD?接收數(shù)據(jù)
引腳3:TXD?發(fā)送數(shù)據(jù)
引腳4:DTR?數(shù)據(jù)終端準(zhǔn)備好
引腳5:SG?信號地
引腳6:DSR?數(shù)據(jù)準(zhǔn)備好
引腳7:RTS?請求發(fā)送
引腳8:?CTS?清除發(fā)送
引腳9:?RI?振鈴提示
(3)在UART0串口編程中我們只用到了引腳2,引腳3,和引腳5.
(4)目前的串口線有兩中連接方法:
平行線:2接2,3接3(即發(fā)對發(fā),接對接)
交叉線:2接3,3接2(即發(fā)對接,接對發(fā))
各個外設(shè)所用的連接方法都不一樣。因此,調(diào)試程序時,一定要注意你所用的是那中串口線。如果串口線選錯的話,它們之間是不通信的。
?
總結(jié)
以上是生活随笔為你收集整理的UART0串口编程(一):通信协议设计;RS232标准的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux编程下open()函数的用法
- 下一篇: UART0串口编程(三):中断方式的串口