- C/C++串口通信:典型應(yīng)用實(shí)例編程實(shí)踐
- 曹衛(wèi)彬等編著
- 4305字
- 2019-01-01 05:44:41
1.1 串口通信的基本概念
1.1.1 并行通信與串行通信
終端與其他設(shè)備(例如其他終端、計(jì)算機(jī)和外部設(shè)備)通過數(shù)據(jù)傳輸進(jìn)行通信。數(shù)據(jù)傳輸可以通過兩種方式進(jìn)行:并行通信和串行通信。
1. 并行通信
在計(jì)算機(jī)和終端之間的數(shù)據(jù)傳輸通常是靠電纜或信道上的電流或電壓變化實(shí)現(xiàn)的。如果一組數(shù)據(jù)的各數(shù)據(jù)位在多條線上同時(shí)被傳輸,這種傳輸方式稱為并行通信,如圖1-1所示。

圖1-1 并行通信
并行數(shù)據(jù)傳輸?shù)奶攸c(diǎn)是:各數(shù)據(jù)位同時(shí)傳輸,傳輸速度快、效率高,多用在實(shí)時(shí)、快速的場(chǎng)合。
并行傳輸?shù)臄?shù)據(jù)寬度可以是1~128位,甚至更寬,但是有多少數(shù)據(jù)位就需要多少根數(shù)據(jù)線,因此傳輸?shù)某杀据^高。在集成電路芯片的內(nèi)部、同一插件板上各部件之間、同一機(jī)箱內(nèi)各插件板之間的數(shù)據(jù)傳輸都是并行的。
并行數(shù)據(jù)傳輸只適用于近距離的通信,通常傳輸距離小于30m。
2. 串行通信
串行通信是指通信的發(fā)送端和接收端之間數(shù)據(jù)信息的傳輸是在單根數(shù)據(jù)線上,以每次一個(gè)二進(jìn)制的0、1為最小單位逐位進(jìn)行傳輸,如圖1-2所示。

圖1-2 串行通信
串行數(shù)據(jù)傳輸?shù)奶攸c(diǎn)是:數(shù)據(jù)傳輸按位順序進(jìn)行,僅需要一根傳輸線即可完成,節(jié)省傳輸線。與并行通信相比,串行通信還有較為顯著的優(yōu)點(diǎn):傳輸距離長(zhǎng),可以從幾米到幾千米;串行通信的通信時(shí)鐘頻率容易提高;串行通信的抗干擾能力十分強(qiáng),其信號(hào)間的互相干擾完全可以忽略。但是串行通信傳送速度比并行通信慢得多。
正是由于串行通信的連線少、成本低,因此它在數(shù)據(jù)采集和控制系統(tǒng)中得到了廣泛的應(yīng)用,產(chǎn)品也是多種多樣的。
1.1.2 串行通信的工作模式
通過單線傳輸信息是串行數(shù)據(jù)通信的基礎(chǔ)。數(shù)據(jù)通常是在兩個(gè)站(點(diǎn)對(duì)點(diǎn))之間進(jìn)行傳輸,按照數(shù)據(jù)流的方向可分成三種傳輸模式:?jiǎn)喂ぁ腚p工、全雙工。
1. 單工模式
單工模式的數(shù)據(jù)傳輸是單向的。通信雙方中,一方固定為發(fā)送端,另一方則固定為接收端。信息只能沿一個(gè)方向傳輸,使用一根傳輸線,如圖1-3所示。

圖1-3 單工模式
單工模式一般用在只向一個(gè)方向傳輸數(shù)據(jù)的場(chǎng)合。例如計(jì)算機(jī)與打印機(jī)之間的通信是單工模式,因?yàn)橹挥杏?jì)算機(jī)向打印機(jī)傳輸數(shù)據(jù),而沒有相反方向的數(shù)據(jù)傳輸。還有在某些通信信道中,如單工無線發(fā)送等。
2. 半雙工模式
半雙工通信使用同一根傳輸線,既可發(fā)送數(shù)據(jù)又可接收數(shù)據(jù),但不能同時(shí)進(jìn)行發(fā)送和接收。
在任何時(shí)刻只能由其中的一方發(fā)送數(shù)據(jù),另一方接收數(shù)據(jù)。因此半雙工模式既可以使用一條數(shù)據(jù)線,也可以使用兩條數(shù)據(jù)線,如圖1-4所示。

圖1-4 半雙工模式
半雙工通信中每端需有一個(gè)收發(fā)切換電子開關(guān),通過切換來決定數(shù)據(jù)向哪個(gè)方向傳輸。因?yàn)橛星袚Q,所以會(huì)產(chǎn)生時(shí)間延遲。信息傳輸效率低些。
3. 全雙工形式
全雙工數(shù)據(jù)通信分別由兩根可以在兩個(gè)不同的站點(diǎn)同時(shí)發(fā)送和接收的傳輸線進(jìn)行傳輸,通信雙方都能在同一時(shí)刻進(jìn)行發(fā)送和接收操作,如圖1-5所示。

圖1-5 全雙工模式
在全雙工模式中,每一端都有發(fā)送器和接收器,有兩條傳輸線,可在交互式應(yīng)用和遠(yuǎn)程監(jiān)控系統(tǒng)中使用,信息傳輸效率較高。
1.1.3 異步傳輸與同步傳輸
在串行傳輸中,數(shù)據(jù)是一位一位地按照到達(dá)的順序依次進(jìn)行傳輸?shù)模课粩?shù)據(jù)的發(fā)送和接收都需要時(shí)鐘來控制。發(fā)送端通過發(fā)送時(shí)鐘確定數(shù)據(jù)位的開始和結(jié)束,接收端需要在適當(dāng)?shù)臅r(shí)間間隔對(duì)數(shù)據(jù)流進(jìn)行采樣來正確地識(shí)別數(shù)據(jù)。接收端和發(fā)送端必須保持步調(diào)一致,否則就會(huì)在數(shù)據(jù)傳輸中出現(xiàn)差錯(cuò)。為了解決以上問題,串行傳輸可采用以下兩種方式:異步傳輸和同步傳輸。
1. 異步傳輸
在異步傳輸方式中,字符是數(shù)據(jù)傳輸單位。在通信的數(shù)據(jù)流中,字符之間異步,字符內(nèi)部各位間同步。異步通信方式的“異步”主要體現(xiàn)在字符與字符之間通信沒有嚴(yán)格的定時(shí)要求。在異步傳輸中,字符可以是連續(xù)地、一個(gè)個(gè)地發(fā)送,也可以是不連續(xù)地、隨機(jī)地單獨(dú)發(fā)送。在一個(gè)字符格式的停止位之后,立即發(fā)送下一個(gè)字符的起始位,開始一個(gè)新的字符的傳輸,這叫做連續(xù)的串行數(shù)據(jù)發(fā)送,即幀與幀之間是連續(xù)的。斷續(xù)的串行數(shù)據(jù)傳輸是指在一幀結(jié)束之后維持?jǐn)?shù)據(jù)線的“空閑”狀態(tài),新的起始位可在任何時(shí)刻開始。一旦傳輸開始,組成這個(gè)字符的各個(gè)數(shù)據(jù)位將被連續(xù)發(fā)送,并且每個(gè)數(shù)據(jù)位持續(xù)的時(shí)間是相等的。接收端根據(jù)這個(gè)特點(diǎn)與數(shù)據(jù)發(fā)送端保持同步,從而正確地恢復(fù)數(shù)據(jù)。收發(fā)雙方則以預(yù)先約定的傳輸速度,在時(shí)鐘的作用下,傳輸這個(gè)字符中的每一位。
2. 同步傳輸
在同步傳輸方式中,比特塊以穩(wěn)定的比特流的形式傳輸,數(shù)據(jù)被封裝成更大的傳輸單位,稱為幀。每個(gè)幀中含有多個(gè)字符代碼,而且字符代碼與字符代碼之間沒有間隙以及起始位和停止位。和異步傳輸相比,數(shù)據(jù)傳輸單位的加長(zhǎng)容易引起時(shí)鐘漂移。為了保證接收端能夠正確地區(qū)分?jǐn)?shù)據(jù)流中的每個(gè)數(shù)據(jù)位,收發(fā)雙方必須通過某種方法建立起同步的時(shí)鐘。例如,可以在發(fā)送器和接收器之間提供一條獨(dú)立的時(shí)鐘線路,由線路的一端(發(fā)送器或者接收器)定期地在每個(gè)比特時(shí)間中向線路發(fā)送一個(gè)短脈沖信號(hào),另一端則將這些有規(guī)律的脈沖作為時(shí)鐘。這種方法在短距離傳輸時(shí)表現(xiàn)良好,但在長(zhǎng)距離傳輸中,定時(shí)脈沖可能會(huì)和信息信號(hào)一樣受到破壞,從而出現(xiàn)定時(shí)誤差。另一種方法是通過采用嵌有時(shí)鐘信息的數(shù)據(jù)編碼位向接收端提供同步信息。
1.1.4 硬件握手與軟件握手
握手信號(hào)實(shí)際上是控制信號(hào),用來控制數(shù)據(jù)的傳輸。通過握手信號(hào),發(fā)送端可以得知接收端是否有數(shù)據(jù)要發(fā)送。接收端通過握手信號(hào)通知發(fā)送端它是否已經(jīng)準(zhǔn)備好了接收信號(hào)。握手信號(hào)遵循某種協(xié)議。
當(dāng)發(fā)送端和接收端處理數(shù)據(jù)的速度不一樣時(shí),可能會(huì)造成數(shù)據(jù)丟失。在傳輸中,如果發(fā)送端的發(fā)送速度大于接收端的接收速度,同時(shí)若接收端處理數(shù)據(jù)的速度不夠快的話,那么接收端的緩沖區(qū)必定在一定時(shí)間后溢出,從而造成以后發(fā)送過來的數(shù)據(jù)不能進(jìn)入緩沖區(qū)而丟失。發(fā)送端何時(shí)可以繼續(xù)發(fā)送數(shù)據(jù),何時(shí)必須暫停發(fā)送,從而讓接收端有時(shí)間處理數(shù)據(jù),稱為流量控制,必須靠握手信號(hào)來解決這個(gè)問題。例如,打印機(jī)和計(jì)算機(jī)進(jìn)行通信時(shí),一些打印機(jī)打印速度可能跟不上計(jì)算機(jī)發(fā)送數(shù)據(jù)的速度,就必須要通過握手信號(hào)通知計(jì)算機(jī)暫停發(fā)送數(shù)據(jù)。
1. 硬件握手
在硬件握手中,發(fā)送端通過將某一個(gè)導(dǎo)線拉到高電平或者低電平,來表示發(fā)送端可以發(fā)送數(shù)據(jù)。接收端已經(jīng)準(zhǔn)備好接收數(shù)據(jù)之后,也把某一個(gè)導(dǎo)線拉到高電平或者是低電平,來通知發(fā)送端,發(fā)送端一直在檢測(cè)這個(gè)信號(hào)。接收端可以在任何時(shí)候把這個(gè)信號(hào)變?yōu)闊o效,甚至是在接收一個(gè)數(shù)據(jù)塊過程中。當(dāng)發(fā)送端檢測(cè)到這個(gè)信號(hào)變?yōu)闊o效之后,就必須停止本次發(fā)送,直到這個(gè)信號(hào)變?yōu)橛行橹埂?/p>
2. 軟件握手
在軟件握手中,以數(shù)據(jù)線上的數(shù)據(jù)信號(hào)來代替實(shí)際的硬件電路。這種方法用在直接連接或者通過調(diào)制解調(diào)器連接的兩臺(tái)計(jì)算機(jī)之間進(jìn)行雙向通信的場(chǎng)合。
對(duì)于軟件握手現(xiàn)在已經(jīng)建立了一些標(biāo)準(zhǔn)協(xié)議,其中最常用的是通信協(xié)議。通信協(xié)議是指通信雙方的一種約定,約定包括對(duì)數(shù)據(jù)格式、同步方式、傳輸速度、傳輸步驟、檢/糾錯(cuò)方式以及控制字符定義等問題進(jìn)行統(tǒng)一規(guī)定,通信雙方必須共同遵守,也叫做通信控制規(guī)程或稱傳輸控制規(guī)程,它屬于OSI七層參考模型中的數(shù)據(jù)鏈路層。
3. 硬件和軟件結(jié)合的握手方法
如果使用個(gè)人計(jì)算機(jī)或終端通過調(diào)制解調(diào)器和主計(jì)算機(jī)進(jìn)行通信,那么調(diào)制解調(diào)器使用硬件握手方法和個(gè)人計(jì)算機(jī)聯(lián)系,主計(jì)算機(jī)和調(diào)制解調(diào)器之間也使用硬件握手方法,主計(jì)算機(jī)和個(gè)人計(jì)算機(jī)之間將使用軟件握手方法進(jìn)行聯(lián)系。因此,個(gè)人計(jì)算機(jī)必須要編程,僅當(dāng)調(diào)制解調(diào)器的DSR(有時(shí)可能使用CD)線電位變高和軟件停止信號(hào)沒有收到時(shí),軟件才送出一個(gè)通知信號(hào)。
一些計(jì)算機(jī)自動(dòng)監(jiān)測(cè)硬件握手信號(hào),這些計(jì)算機(jī)等待硬件握手信號(hào)變高以后送出一個(gè)字符,所以程序只需要處理軟件握手信號(hào)。
1.1.5 串口通信的基本參數(shù)
串口的通信方式是將字節(jié)拆分成一個(gè)接著一個(gè)的位后再進(jìn)行傳輸。接到此電位信號(hào)的一方再將此一個(gè)一個(gè)的位組合成原來的字節(jié),如此形成一個(gè)字節(jié)的完整傳輸。
在傳輸進(jìn)行的過程中,雙方明確傳輸信息的具體方式,否則雙方就會(huì)沒有一套共同的譯碼方式,從而無法了解對(duì)方所傳輸過來的信息的意義。因此雙方為了進(jìn)行通信,必須遵守一定的通信規(guī)則,這個(gè)共同的規(guī)則就是串口的初始化。
串口的初始化必須對(duì)以下幾項(xiàng)參數(shù)進(jìn)行設(shè)置。
1. 數(shù)據(jù)的傳輸速度
串行通信的傳輸受到通信雙方配備性能及通信線路的特性所控制,收發(fā)雙方必須按照同樣的速率進(jìn)行串行通信,即收發(fā)雙方采用同樣的波特率。我們通常將傳輸速度稱為波特率,指的是串行通信中每秒所傳輸?shù)臄?shù)據(jù)位數(shù),單位是b/s。我們經(jīng)常可以看到儀器或Modem的規(guī)格書上都寫著19200b/s、38400b/s,…,所指的就是傳輸速度。
就儀器或工業(yè)場(chǎng)合來說,4800b/s、9600b/s是最常見的傳輸速度,現(xiàn)在的個(gè)人計(jì)算機(jī)所提供的串口的傳輸速度都可達(dá)到15200b/s(甚至達(dá)到921600b/s),若傳輸距離較近而設(shè)備也提供時(shí),使用最高的傳輸速度也可以。
例如在某異步串行通信中,每傳輸一個(gè)字符需要8位,如果采用波特率4800b/s進(jìn)行傳輸,則每秒可以傳輸600個(gè)字符。
2. 數(shù)據(jù)的傳輸單位
一般串口所傳輸?shù)臄?shù)據(jù)是字符型,若用來傳輸文件,則會(huì)使用二進(jìn)制的數(shù)據(jù)形式。當(dāng)使用字符型時(shí),工業(yè)界使用到的有ASCII字符碼及JIS字符碼;ASCII碼使用了8位形成一個(gè)字符,而JIS碼則以7位形成一個(gè)字符。我們可以發(fā)現(xiàn),歐美的設(shè)備多使用8位的字節(jié),而日本的設(shè)備多使用7位為一個(gè)字節(jié)。以實(shí)際的RS-232傳輸上看來,由于工業(yè)界常使用的PLC大多只是傳輸文字碼,因此只要7位就可以將ASCII碼的0~127碼表達(dá)出來(27=128,共有128種組合方式),所有的可見字符也在此范圍內(nèi),所以只要7個(gè)數(shù)據(jù)位就夠了。不同的情形下(根據(jù)所使用的協(xié)議),會(huì)使用到不同的傳輸單位。使用多少位合成一個(gè)字節(jié)必須先行確定。
3. 起始位與停止位
由于異步串行傳輸中并沒有使用同步脈沖作為基準(zhǔn),故接收端完全不知道發(fā)送端何時(shí)將進(jìn)行數(shù)據(jù)的傳輸。發(fā)送端準(zhǔn)備要開始傳輸數(shù)據(jù)時(shí),發(fā)送端會(huì)在所送出的字符前后分別加上高電位的起始位(邏輯0)及低電位的停止位(邏輯1),它們分別是所謂的起始位和停止位,也就是說,當(dāng)發(fā)送端要開始傳輸數(shù)據(jù)時(shí),便將傳輸線上的電位由低電位提升至高電位,而當(dāng)傳輸結(jié)束后,再將電位降至低電位。接收端會(huì)因起始位的觸發(fā)(因電壓由低電位升至高電位)而開始接收數(shù)據(jù);并因停止位的通知(因電壓維持在低電位)而明確數(shù)據(jù)的字符信號(hào)已經(jīng)結(jié)束;加入了起始位及停止位才能比較容易達(dá)到多字符的接收能力。起始位固定為1位,而停止位則有1、1.5、2位等多種選擇,如何選擇呢?只要通信雙方協(xié)議通過即可,沒有強(qiáng)制規(guī)定。
4. 校驗(yàn)位
為了預(yù)防錯(cuò)誤的產(chǎn)生,使用校驗(yàn)位作為檢查的機(jī)制。校驗(yàn)位是用來檢查所傳輸數(shù)據(jù)的正確性的一種核對(duì)碼,又可分成奇校驗(yàn)與偶校驗(yàn)兩種,分別是檢查字符碼中1的數(shù)目是奇數(shù)或偶數(shù)。以偶校驗(yàn)為例,“A”的ASCII碼是41H(十六進(jìn)制),將它以二進(jìn)制表示時(shí),是01000001,其中1的數(shù)目是2,因此校驗(yàn)位便是0,使1的數(shù)目保持偶數(shù);同樣地,校驗(yàn)位是奇校驗(yàn)時(shí),“A”的校驗(yàn)位便是1,使1的數(shù)目保持在奇數(shù)。接收端重新計(jì)算奇偶校驗(yàn)位,如果新的計(jì)算值正確,那么表示正常。如果新的計(jì)算值錯(cuò)誤,那么接收端就會(huì)發(fā)出一些指示,表示此次接收的數(shù)據(jù)有誤。
- Aptana Studio Beginner's Guide
- React:Cross-Platform Application Development with React Native
- 大話社交網(wǎng)絡(luò)
- Yii Application Development Cookbook(Second Edition)
- Working with Legacy Systems
- 網(wǎng)絡(luò)設(shè)計(jì)與應(yīng)用(第2版)
- 大型企業(yè)微服務(wù)架構(gòu)實(shí)踐與運(yùn)營(yíng)
- 局域網(wǎng)組成實(shí)踐
- 轉(zhuǎn)化:提升網(wǎng)站流量和轉(zhuǎn)化率的技巧
- 互聯(lián)網(wǎng)安全的40個(gè)智慧洞見(2016)
- React Design Patterns and Best Practices(Second Edition)
- 物聯(lián)網(wǎng)技術(shù)與實(shí)踐
- ReasonML Quick Start Guide
- 從實(shí)踐中學(xué)習(xí)Kali Linux網(wǎng)絡(luò)掃描
- Telerik WPF Controls Tutorial