第15章 串行通信原理與設計 浙江農(nóng)林_第1頁
第15章 串行通信原理與設計 浙江農(nóng)林_第2頁
第15章 串行通信原理與設計 浙江農(nóng)林_第3頁
第15章 串行通信原理與設計 浙江農(nóng)林_第4頁
第15章 串行通信原理與設計 浙江農(nóng)林_第5頁
已閱讀5頁,還剩67頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、 介紹串行通信的基本概念,包括串行介紹串行通信的基本概念,包括串行通信的原理、傳輸協(xié)議以及各種串行傳輸通信的原理、傳輸協(xié)議以及各種串行傳輸?shù)慕涌跇藴实慕涌跇藴?最后講解了最后講解了WindowsWindows環(huán)境下,最常見的環(huán)境下,最常見的APIAPI編程方法編程方法串行通信基本概念串行通信基本概念15.1串行傳輸協(xié)議串行傳輸協(xié)議15.2使用使用Windows API進行同步串口編程進行同步串口編程15.3采用重疊采用重疊I/O方式的編程方法方式的編程方法15.4采用事件驅(qū)動方式的編程方法采用事件驅(qū)動方式的編程方法15.515.1 串行通信基本概念 通信,是在一些聯(lián)絡信號的控制下,通信,是在一

2、些聯(lián)絡信號的控制下,一次將一次將8位、位、16位或位或32位數(shù)據(jù)同時進行傳送位數(shù)據(jù)同時進行傳送的通信方式。在并行通信中,傳輸線數(shù)量的通信方式。在并行通信中,傳輸線數(shù)量沒有限制,除了數(shù)據(jù)線之外還應設置有通沒有限制,除了數(shù)據(jù)線之外還應設置有通信聯(lián)絡控制線信聯(lián)絡控制線。 串行通信,只需一對傳輸線,數(shù)據(jù)的串行通信,只需一對傳輸線,數(shù)據(jù)的各位按照時間順序依次傳送,如各位按照時間順序依次傳送,如8位數(shù)據(jù)分位數(shù)據(jù)分8次傳送。次傳送。15.1.1 15.1.1 串行通信特點串行通信特點 由于在一條傳輸線上既傳輸數(shù)據(jù)信息,由于在一條傳輸線上既傳輸數(shù)據(jù)信息,又傳輸控制聯(lián)絡信息,這就需要一系列約又傳輸控制聯(lián)絡信息,

3、這就需要一系列約定,從而識別一條線上傳送的信息流中,定,從而識別一條線上傳送的信息流中,哪一部分是數(shù)據(jù)信號,哪一部分是聯(lián)絡信哪一部分是數(shù)據(jù)信號,哪一部分是聯(lián)絡信號。號。 串行通信的信息格式有異步和同步信串行通信的信息格式有異步和同步信息格式。與此對應,有異步串行通信和同息格式。與此對應,有異步串行通信和同步串行通信兩種方式。步串行通信兩種方式。 由于串行通信中信息邏輯定義與由于串行通信中信息邏輯定義與TTL不不兼容,故需要邏輯電平轉(zhuǎn)換,以提高信息兼容,故需要邏輯電平轉(zhuǎn)換,以提高信息傳輸?shù)目煽啃?。傳輸?shù)目煽啃浴?為為了降低通信線路的成本和簡化通信了降低通信線路的成本和簡化通信設備,可用現(xiàn)存信道(

4、如電話、電報信道設備,可用現(xiàn)存信道(如電話、電報信道等),配以適當?shù)耐ㄐ沤涌冢谌我鈨牲c等),配以適當?shù)耐ㄐ沤涌?,在任意兩點之間實現(xiàn)串行通信。之間實現(xiàn)串行通信。 15.1.2 15.1.2 串行通信傳輸方式串行通信傳輸方式 串行通信的過程是將通信雙方傳輸?shù)拇型ㄐ诺倪^程是將通信雙方傳輸?shù)臄?shù)據(jù)序列變成電信號,在選定的通信線路數(shù)據(jù)序列變成電信號,在選定的通信線路上完成傳遞。通常,將通信傳輸方式分為上完成傳遞。通常,將通信傳輸方式分為信號傳輸方式和線路傳輸方式兩部分。信號傳輸方式和線路傳輸方式兩部分。 1信號傳輸方式信號傳輸方式 在近距離傳輸時,廣泛使用的是按信號原在近距離傳輸時,廣泛使用的是按信號

5、原樣傳輸?shù)幕▊鬏敺绞?。樣傳輸?shù)幕▊鬏敺绞健?在遠距離傳輸時,通常需要使用在遠距離傳輸時,通常需要使用Modem。通過通過Modem,可以將原信號調(diào)制為高頻的模擬,可以將原信號調(diào)制為高頻的模擬信號,然后通過電話網(wǎng)絡,進行遠距離傳輸。信號,然后通過電話網(wǎng)絡,進行遠距離傳輸。 2線路傳輸方式線路傳輸方式 在串行通信中,數(shù)據(jù)通常是在兩個站(如在串行通信中,數(shù)據(jù)通常是在兩個站(如微機、終端等)之間進行傳送,按照數(shù)據(jù)流微機、終端等)之間進行傳送,按照數(shù)據(jù)流的方向及對線路的使用方式可分為如下幾種的方向及對線路的使用方式可分為如下幾種基本傳輸方式:基本傳輸方式: 單工傳輸方式。這種方式,在傳輸線路單工傳輸

6、方式。這種方式,在傳輸線路上,數(shù)據(jù)只能按一個固定的方向,且是交互上,數(shù)據(jù)只能按一個固定的方向,且是交互式的。式的。 半雙工方式。當使用同一根傳輸線既作半雙工方式。當使用同一根傳輸線既作為輸入又作為輸出時,雖然數(shù)據(jù)可以在兩個為輸入又作為輸出時,雖然數(shù)據(jù)可以在兩個方向上傳送,但通信雙方不能同時收發(fā)數(shù)據(jù)方向上傳送,但通信雙方不能同時收發(fā)數(shù)據(jù),這種傳輸方式就是半雙工傳輸方式。,這種傳輸方式就是半雙工傳輸方式。 全雙工傳輸方式。當數(shù)據(jù)的發(fā)送和接收全雙工傳輸方式。當數(shù)據(jù)的發(fā)送和接收分別由兩根不同的傳輸線傳輸時,通信雙方分別由兩根不同的傳輸線傳輸時,通信雙方都能在同一時刻進行發(fā)送和接收操作都能在同一時刻進行

7、發(fā)送和接收操作。 多工傳輸方式。使用復用技術,將一個多工傳輸方式。使用復用技術,將一個信道(即傳輸信號的線路)劃分為若干個頻信道(即傳輸信號的線路)劃分為若干個頻帶或時間片,從而使多路信號同時共享信道帶或時間片,從而使多路信號同時共享信道,這就是多工傳輸方式。,這就是多工傳輸方式。15.1.3 15.1.3 數(shù)據(jù)糾錯與檢錯數(shù)據(jù)糾錯與檢錯 在基本通信規(guī)程中一般采用奇偶校驗在基本通信規(guī)程中一般采用奇偶校驗或方陣碼檢錯,以反饋重發(fā)方式糾錯。在或方陣碼檢錯,以反饋重發(fā)方式糾錯。在高級通信控制規(guī)程中,一般采用循環(huán)冗余高級通信控制規(guī)程中,一般采用循環(huán)冗余碼碼CRC(Cycle Redundancy Cod

8、e)檢驗)檢驗,以自動糾錯方式來糾錯。,以自動糾錯方式來糾錯。 首先,改善傳輸通道的電特性,使誤首先,改善傳輸通道的電特性,使誤碼率達到要求,但是由于經(jīng)濟因素和技術碼率達到要求,但是由于經(jīng)濟因素和技術因素等條件的限制,這方面的努力往往不因素等條件的限制,這方面的努力往往不能得到理想的效果;能得到理想的效果; 其次,采取檢錯、糾錯技術,即所謂其次,采取檢錯、糾錯技術,即所謂差錯控制技術,在差錯控制技術中,對數(shù)差錯控制技術,在差錯控制技術中,對數(shù)據(jù)進行可靠有效地編碼是很重要的途徑之據(jù)進行可靠有效地編碼是很重要的途徑之一。一。15.1.4 傳輸速率與距離 傳輸速率和距離是衡量串行通信的兩個傳輸速率和

9、距離是衡量串行通信的兩個重要方面。重要方面。 通常串行通信涉及以下通常串行通信涉及以下三三個方面:個方面:1波特率波特率2發(fā)送接收時鐘發(fā)送接收時鐘3傳輸距離與傳輸速率的關系傳輸距離與傳輸速率的關系 波特率波特率 在并行通信中,傳輸速率以每秒傳送的在并行通信中,傳輸速率以每秒傳送的字節(jié)(字節(jié)(B/s)數(shù)來表示,而串行通信中,在基)數(shù)來表示,而串行通信中,在基波傳輸?shù)那闆r下用每秒傳送的位數(shù)(波傳輸?shù)那闆r下用每秒傳送的位數(shù)(bit/s)來表示數(shù)據(jù)傳輸速率。來表示數(shù)據(jù)傳輸速率。 用的標準波特率是用的標準波特率是110、300、1200、2 400、4 800、9 600和和19 200等。隨著技術的等

10、。隨著技術的進步,某些串行通信可以支持更高的波特率進步,某些串行通信可以支持更高的波特率,如,如38 400、57 600等。等。 發(fā)送接收時鐘發(fā)送接收時鐘 在發(fā)送數(shù)據(jù)時,發(fā)送器在發(fā)送時鐘的有效在發(fā)送數(shù)據(jù)時,發(fā)送器在發(fā)送時鐘的有效沿(下降沿)作用下將移位寄存器的數(shù)據(jù)按位沿(下降沿)作用下將移位寄存器的數(shù)據(jù)按位移位串行輸出。移位串行輸出。 發(fā)送發(fā)送/接收時鐘頻率與波特率的關系如下:接收時鐘頻率與波特率的關系如下: 發(fā)送發(fā)送/接收時鐘頻率接收時鐘頻率n發(fā)送發(fā)送/接收波特率接收波特率 表達式中的表達式中的n1,16,64。 傳輸距離與傳輸速率的關系傳輸距離與傳輸速率的關系 串行接口或終端直接傳送串行

11、信息流的串行接口或終端直接傳送串行信息流的最大距離與傳輸速率及傳輸線的電氣特性有最大距離與傳輸速率及傳輸線的電氣特性有關,傳輸距離隨傳輸速率的增加而減少。關,傳輸距離隨傳輸速率的增加而減少。 RS-232C標準規(guī)定,當數(shù)據(jù)傳送速度小標準規(guī)定,當數(shù)據(jù)傳送速度小于于20kbit/s,并且電纜的電容負荷小于,并且電纜的電容負荷小于2 500pF時,傳送距離小于時,傳送距離小于30m。由于電纜的。由于電纜的電容沒有那么大,當傳輸速度較慢時,傳輸電容沒有那么大,當傳輸速度較慢時,傳輸距離將超過這個距離。距離將超過這個距離。15.2 串行傳輸協(xié)議 采用的串行通信協(xié)議有兩類:異步通采用的串行通信協(xié)議有兩類:

12、異步通信和同步通信。信和同步通信。 同步協(xié)議又分為面向字符、面向比特同步協(xié)議又分為面向字符、面向比特和面向字節(jié)計數(shù)和面向字節(jié)計數(shù)3種。種。15.2.1 異步傳輸協(xié)議 1特點及傳輸格式特點及傳輸格式 在傳輸一個字符時總是以起始位開始,在傳輸一個字符時總是以起始位開始,以停止位結(jié)束。異步通信傳輸格式如圖以停止位結(jié)束。異步通信傳輸格式如圖15.1所示。所示。 圖圖15.1 異步通信字符傳輸幀格式異步通信字符傳輸幀格式 2異步傳輸?shù)腻e誤檢測異步傳輸?shù)腻e誤檢測 由于線路或程序出錯等原因,使得通信由于線路或程序出錯等原因,使得通信過程中產(chǎn)生了傳送錯誤。因為異步通信的實過程中產(chǎn)生了傳送錯誤。因為異步通信的實

13、質(zhì)是字符的發(fā)送是隨機的,接收方通??蓹z質(zhì)是字符的發(fā)送是隨機的,接收方通常可檢測到如下一些錯誤:奇偶錯測到如下一些錯誤:奇偶錯、超越錯超越錯、幀格幀格式錯式錯。15.2.2 面向字符的同步傳輸協(xié)議1特點與格式特點與格式 它的特點是一次傳送由若干個字符組成它的特點是一次傳送由若干個字符組成的數(shù)據(jù)塊,而不是只傳送一個字符,并規(guī)定的數(shù)據(jù)塊,而不是只傳送一個字符,并規(guī)定了了10個特殊字符作為這個數(shù)據(jù)塊的開頭與結(jié)個特殊字符作為這個數(shù)據(jù)塊的開頭與結(jié)束標志以及整個傳輸過程的控制信息,它們束標志以及整個傳輸過程的控制信息,它們也叫做通信控制字。由于被傳送的數(shù)據(jù)塊是也叫做通信控制字。由于被傳送的數(shù)據(jù)塊是由一序列字

14、符組成的,故被稱為面向字符的由一序列字符組成的,故被稱為面向字符的協(xié)議。協(xié)議的一幀數(shù)據(jù)格式如圖協(xié)議。協(xié)議的一幀數(shù)據(jù)格式如圖15.2所示。所示。 圖圖15.2 面向字符的同步協(xié)議幀格式面向字符的同步協(xié)議幀格式 由圖由圖15.2可知,一個面向字符的數(shù)據(jù)幀可知,一個面向字符的數(shù)據(jù)幀由幾個控制字符開始,緊跟著數(shù)據(jù)位數(shù)相由幾個控制字符開始,緊跟著數(shù)據(jù)位數(shù)相同的各字符(同的各字符(1n),最后以校驗字段結(jié)),最后以校驗字段結(jié)束束。2控制字符的定義控制字符的定義 在面向字符同步協(xié)議的幀格式中規(guī)定了在面向字符同步協(xié)議的幀格式中規(guī)定了10個通信控制字符。面向字符協(xié)議中規(guī)定的個通信控制字符。面向字符協(xié)議中規(guī)定的1

15、0個通信控制字符的名稱及代碼如表個通信控制字符的名稱及代碼如表15.1所所示。示。 面向字符的同步通信有別于異步通信面向字符的同步通信有別于異步通信的一個特點是,它允許連續(xù)發(fā)送一序列字的一個特點是,它允許連續(xù)發(fā)送一序列字符,而每個字符的數(shù)據(jù)位數(shù)都相同,且沒符,而每個字符的數(shù)據(jù)位數(shù)都相同,且沒有起始位和停止位。有起始位和停止位。 由于在面向字符的同步通信協(xié)議中采用由于在面向字符的同步通信協(xié)議中采用了一些傳輸控制字,從而增強了通信控制了一些傳輸控制字,從而增強了通信控制能力和校驗功能,但也出現(xiàn)了一些問題。能力和校驗功能,但也出現(xiàn)了一些問題。15.2.3 面向比特的同步傳輸協(xié)議1特點與格式特點與格式

16、 面向比特的同步傳輸又稱做二進制同步面向比特的同步傳輸又稱做二進制同步傳輸。在面向比特的同步協(xié)議中,最有代表傳輸。在面向比特的同步協(xié)議中,最有代表性的同步協(xié)議有如下性的同步協(xié)議有如下3種:種: 同步數(shù)據(jù)鏈路控制規(guī)程同步數(shù)據(jù)鏈路控制規(guī)程SDLC(Synchronous Data Link Control),由),由IBM公司制定。公司制定。 高級數(shù)據(jù)鏈路控制規(guī)程高級數(shù)據(jù)鏈路控制規(guī)程HDLC(High Level Data Link Control),由國際標準化組織),由國際標準化組織ISO(International Standards Organization)制定。)制定。 先進數(shù)據(jù)通信規(guī)

17、程先進數(shù)據(jù)通信規(guī)程ADCCP(Advanced Data Communications Control Procedure),由美國國家標準協(xié)會制定。),由美國國家標準協(xié)會制定。 2幀信息的分段幀信息的分段 SDLC/HDLC的一幀信息包括以下幾個的一幀信息包括以下幾個場,所有場都是從最低有效位開始傳送。場,所有場都是從最低有效位開始傳送。 SDLC/HDLC的標志字符。的標志字符。SDLC/HDLC協(xié)議規(guī)定,所有信息傳輸必須以一個標志符協(xié)議規(guī)定,所有信息傳輸必須以一個標志符開始,且以同一個標志符結(jié)束。這個標志符開始,且以同一個標志符結(jié)束。這個標志符是是01111110,稱為標志場(,稱為標志

18、場(Flag)。)。 地址場和控制場在標志場之后,可以有地址場和控制場在標志場之后,可以有一個地址場一個地址場A(Address)和一個控制場)和一個控制場C(Control)。地址場用來規(guī)定與之通信的)。地址場用來規(guī)定與之通信的次站地址。控制場可規(guī)定若干個命令。次站地址??刂茍隹梢?guī)定若干個命令。 信息場(數(shù)據(jù)場)。跟在控制場之后的信息場(數(shù)據(jù)場)。跟在控制場之后的信息場信息場I(Information)。信息場包含有要)。信息場包含有要傳送的數(shù)據(jù),并不是每一幀都必須有信息場傳送的數(shù)據(jù),并不是每一幀都必須有信息場,即數(shù)據(jù)場可為,即數(shù)據(jù)場可為0。當它為。當它為0時,則這一幀時,則這一幀主要是控制

19、命令。主要是控制命令。 幀校驗場。緊跟在信息場之后的是兩幀校驗場。緊跟在信息場之后的是兩個字節(jié)的幀校驗場,幀校驗場稱為個字節(jié)的幀校驗場,幀校驗場稱為FC(Frame Check)或稱為幀校驗序列)或稱為幀校驗序列FCS(Frame Check Sequence)。)。SDLC/HDLC均采用循環(huán)冗余校驗碼均采用循環(huán)冗余校驗碼CRC。其生成多項式為。其生成多項式為CCITT多項式多項式x16+x12+x5+1。除了標志場和自動插入的。除了標志場和自動插入的“0”位外,所有的信息都參加位外,所有的信息都參加CRC計算。計算。3實際應用時的幾個技術問題實際應用時的幾個技術問題 “0”位插入位插入/刪

20、除技術。由于刪除技術。由于SDLC/HDLC協(xié)議規(guī)定以協(xié)議規(guī)定以01111110為標志字為標志字節(jié),但在信息場中也完全有可能有同一種模節(jié),但在信息場中也完全有可能有同一種模式的字符,為了能將它與標志區(qū)分開來,所式的字符,為了能將它與標志區(qū)分開來,所以采取了以采取了“0”位插入和刪除技術。位插入和刪除技術。 SDLC/HDLC異常結(jié)束。如果在發(fā)送過程異常結(jié)束。如果在發(fā)送過程中出現(xiàn)錯誤,則中出現(xiàn)錯誤,則SDLC/HDLC協(xié)議用異常結(jié)束協(xié)議用異常結(jié)束(Abort)字符,或稱失效序列使本幀作廢。)字符,或稱失效序列使本幀作廢。 HDLC的的3種基本通信操作方式。正常響種基本通信操作方式。正常響應方式(

21、應方式(NRA),用于由一個主站和多個從),用于由一個主站和多個從站組成的多點式結(jié)構。異步響應方式(站組成的多點式結(jié)構。異步響應方式(ARM),用于一個主站和一個從站組成的點點式),用于一個主站和一個從站組成的點點式結(jié)構,或者通信雙方均由主站和從站疊加而結(jié)構,或者通信雙方均由主站和從站疊加而成的平衡型結(jié)構。成的平衡型結(jié)構。 同步通信中的糾錯與數(shù)據(jù)幀重發(fā)。面同步通信中的糾錯與數(shù)據(jù)幀重發(fā)。面向比特的同步協(xié)議中,由標志字段開始,向比特的同步協(xié)議中,由標志字段開始,緊跟著幾千比特的信息,最后以具有自動緊跟著幾千比特的信息,最后以具有自動糾錯能力的糾錯能力的CRC校驗碼結(jié)束。校驗碼結(jié)束。15.3 使用

22、Windows API進行同步串口編程 如何使用如何使用API實現(xiàn)串口通信,對于數(shù)據(jù)實現(xiàn)串口通信,對于數(shù)據(jù)的接收采用查詢方式。的接收采用查詢方式。 使用使用WinAPI來編寫串口通信程序時,來編寫串口通信程序時,讀寫操作可以有同步方式與重疊的異步方讀寫操作可以有同步方式與重疊的異步方式。式。15.3.1 概述 所謂同步方式,就是當發(fā)出寫命令后,所謂同步方式,就是當發(fā)出寫命令后,直到數(shù)據(jù)確實寫入到輸出緩沖區(qū)后,寫函數(shù)直到數(shù)據(jù)確實寫入到輸出緩沖區(qū)后,寫函數(shù)才返回。這種方式操作簡單,但當數(shù)據(jù)寫入才返回。這種方式操作簡單,但當數(shù)據(jù)寫入時間較長時,將會使程序掛起,降低程序的時間較長時,將會使程序掛起,降

23、低程序的效率。效率。 首先使用首先使用CreateFile()函數(shù)打開串口,函數(shù)打開串口,以非重疊方式打開。該函數(shù)可以返回一個以非重疊方式打開。該函數(shù)可以返回一個串口句柄,使用該句柄初始化串口參數(shù)。串口句柄,使用該句柄初始化串口參數(shù)。然后使用然后使用WriteFile()可以發(fā)送串行數(shù)據(jù),使可以發(fā)送串行數(shù)據(jù),使用用ReadFile()可以從串口讀取串行數(shù)據(jù)。操可以從串口讀取串行數(shù)據(jù)。操作完串口后,使用作完串口后,使用CloseHandle()函數(shù)來關函數(shù)來關閉串口。閉串口。15.3.2 15.3.2 創(chuàng)建串口創(chuàng)建串口1CreateFil 該函數(shù)是一個通用的創(chuàng)建或打開文件的該函數(shù)是一個通用的創(chuàng)建

24、或打開文件的函數(shù)。在函數(shù)。在WinAPI編程中,它不僅可以操作文編程中,它不僅可以操作文件,也可以操作串口。使用該函數(shù)可以打開件,也可以操作串口。使用該函數(shù)可以打開一個串口,并返回一個句柄,在程序中便可一個串口,并返回一個句柄,在程序中便可以通過訪問該句柄來實現(xiàn)對串口的訪問。下以通過訪問該句柄來實現(xiàn)對串口的訪問。下面針對在串口方面的應用介紹其參數(shù)的含義面針對在串口方面的應用介紹其參數(shù)的含義及設置方法。及設置方法。HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_

25、ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile );2SetupComm()函數(shù)函數(shù)設置串口輸入緩沖區(qū)及輸出緩沖區(qū)的大小。設置串口輸入緩沖區(qū)及輸出緩沖區(qū)的大小。BOOL SetupComm( HANDLE hFile, DWORD dwInQueue, DWORD dwOutQueue );3DCB數(shù)據(jù)結(jié)構數(shù)據(jù)結(jié)構 串口通信中,使用該數(shù)據(jù)結(jié)構存放通信串口通信中,使用該數(shù)據(jù)結(jié)構存放通信參數(shù)。由于該結(jié)構包括的通信參數(shù)很多,逐參

26、數(shù)。由于該結(jié)構包括的通信參數(shù)很多,逐個設置不方便。通常的做法是首先將串口的個設置不方便。通常的做法是首先將串口的當前設置值讀出到一個當前設置值讀出到一個DCB結(jié)構中,然后根結(jié)構中,然后根據(jù)需要修改該據(jù)需要修改該DCB結(jié)構中的某些參數(shù),再以結(jié)構中的某些參數(shù),再以該結(jié)構來設置串口通信參數(shù)。該結(jié)構來設置串口通信參數(shù)。4SetCommState()函數(shù)函數(shù) 要設置串行通信參數(shù),首先定義一個要設置串行通信參數(shù),首先定義一個DCB結(jié)構結(jié)構類型的變量。根據(jù)通信要求,設置該結(jié)構變量的數(shù)值類型的變量。根據(jù)通信要求,設置該結(jié)構變量的數(shù)值,然后以該結(jié)構變量作為參數(shù),執(zhí)行,然后以該結(jié)構變量作為參數(shù),執(zhí)行SetComm

27、State()函數(shù)即可完成串口通信參數(shù)的設置函數(shù)即可完成串口通信參數(shù)的設置。 BOOL SetCommState( HANDLE hFile, LPDCB lpDCB );5GetCommState()函數(shù)函數(shù) 使用該函數(shù)可以獲取當前串口通信參數(shù)使用該函數(shù)可以獲取當前串口通信參數(shù)的設置值。獲取的參數(shù)值存放到一個的設置值。獲取的參數(shù)值存放到一個DCB結(jié)結(jié)構型的變量中。構型的變量中。 BOOL GetCommState( HANDLE hFile, LPDCB lpDCB );6舉例說明舉例說明 舉舉例子說明創(chuàng)建串口的程序代碼,串口例子說明創(chuàng)建串口的程序代碼,串口參數(shù)在代碼注釋中說明參數(shù)在代碼注釋

28、中說明。15.3.3 關閉串口 關閉串口的操作很簡單,只需執(zhí)行關閉串口的操作很簡單,只需執(zhí)行CloseHandle()函數(shù)即可。函數(shù)即可。 BOOL CloseHandle( HANDLE hObject /指向串口句柄指向串口句柄 );15.3.4 發(fā)送數(shù)據(jù) 發(fā)送數(shù)據(jù)使用發(fā)送數(shù)據(jù)使用WriteFile()函數(shù)。函數(shù)。 BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped ); 1

29、5.3.5 接收數(shù)據(jù) 接收數(shù)據(jù)使用接收數(shù)據(jù)使用ReadFile()函數(shù)。函數(shù)。 BOOL ReadFile( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped ); 15.3.6 定時接收數(shù)據(jù)的方法 1編寫定時器響應函數(shù)編寫定時器響應函數(shù) 定時器響應函數(shù)是全局函數(shù),不屬于任定時器響應函數(shù)是全局函數(shù),不屬于任何類。直接在何類。直接在cpp文件中書寫,格式如下:文件中書寫,格式如下: VOID CALLBACK Timer

30、Proc( HWND hwnd, /發(fā)出定時器消息窗口的句柄發(fā)出定時器消息窗口的句柄 UINT uMsg, /WM_TIMER消息消息 UINT idEvent, /定時器定時器ID DWORD dwTime) /當前的系統(tǒng)時間當前的系統(tǒng)時間 /這里加入接收操作代碼這里加入接收操作代碼 該函數(shù)是一個回調(diào)函數(shù)。當設置的定時器時間該函數(shù)是一個回調(diào)函數(shù)。當設置的定時器時間達到時,由系統(tǒng)自動調(diào)用。調(diào)用該函數(shù)時,傳入達到時,由系統(tǒng)自動調(diào)用。調(diào)用該函數(shù)時,傳入4個參數(shù)。個參數(shù)。 2啟動定時器啟動定時器 啟動定時器使用啟動定時器使用SetTimer()函數(shù)。該函數(shù)可在函數(shù)。該函數(shù)可在程序的任何地方加入。程序

31、的任何地方加入。 UINT SetTimer( HWND hWnd, /發(fā)出定時器消發(fā)出定時器消息窗口的句柄息窗口的句柄 UINT nIDEvent, /定時器定時器ID UINT uElapse, /超時值超時值 TIMERPROC lpTimerFunc /定時器處理程定時器處理程序的地址序的地址 ); 3關閉定時器關閉定時器 關閉定時器使用關閉定時器使用KillTimer()函數(shù)。該函函數(shù)。該函數(shù)可在程序的任何地方加入。數(shù)可在程序的任何地方加入。 BOOL KillTimer( HWND hWnd, / handle of window that installed timer UINT

32、 uIDEvent / timer identifier ); 15.4 采用重疊I/O方式的編程方法 采用同步方式的查詢方式讀取串口數(shù)采用同步方式的查詢方式讀取串口數(shù)據(jù)時,若由于讀取操作耗費較長的時間,據(jù)時,若由于讀取操作耗費較長的時間,則程序會被掛起。為解決這種問題,可以則程序會被掛起。為解決這種問題,可以在讀取數(shù)據(jù)時采用重疊在讀取數(shù)據(jù)時采用重疊I/O操作。操作。 為實現(xiàn)重疊為實現(xiàn)重疊I/O操作,主要有如下幾個操作,主要有如下幾個編程步驟:定義全局變量、創(chuàng)建串口、發(fā)編程步驟:定義全局變量、創(chuàng)建串口、發(fā)出讀寫操作、讀寫線程函數(shù)的建立、關閉出讀寫操作、讀寫線程函數(shù)的建立、關閉串口等。串口等。

33、15.4.1 定義全局變量 在主對話框的實現(xiàn)文件(后綴名為在主對話框的實現(xiàn)文件(后綴名為cpp)中定義全局變量。通常在該文件的最頂)中定義全局變量。通常在該文件的最頂端,在所有函數(shù)的外面定義。端,在所有函數(shù)的外面定義。 HANDLE hCom; /串口句柄串口句柄 DWORD ThreadProcWrite(LPVOID pParam); /寫線程寫線程函數(shù)函數(shù) DWORD ThreadProcRead(LPVOID pParam); /讀線程讀線程函數(shù)函數(shù) OVERLAPPED Wol=0; /寫操作寫操作 OVERLAPPED結(jié)構變量結(jié)構變量 OVERLAPPED Rol=0; /讀操作讀

34、操作OVERLAPPED結(jié)構變量結(jié)構變量 HANDLE hThreadWrite; /寫線程句柄寫線程句柄 HANDLE hThreadRead; /讀線程句柄讀線程句柄HWND hWnd; 15.4.2 創(chuàng)建串口 創(chuàng)建串口的操作可以設置在一個按鈕創(chuàng)建串口的操作可以設置在一個按鈕的單擊事件中執(zhí)行,也可以在主對話框的的單擊事件中執(zhí)行,也可以在主對話框的初始化函數(shù)初始化函數(shù)OnInitDialog()中執(zhí)行。中執(zhí)行。 15.4.3 發(fā)出讀寫操作 1讀操作讀操作 在讀操作中,只是啟動讀線程。實際的在讀操作中,只是啟動讀線程。實際的讀操作在讀線程函數(shù)中完成。讀操作在讀線程函數(shù)中完成。 2寫操作寫操作

35、在寫操作中,同樣只是啟動寫線程。實在寫操作中,同樣只是啟動寫線程。實際的寫操作在寫線程函數(shù)中完成。際的寫操作在寫線程函數(shù)中完成。 DWORD dwThreadID;/ DWORD dwParam; hThreadWrite=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE )ThreadProcWrite, /寫線程函數(shù)寫線程函數(shù)名稱名稱 &dwParam, 0, /創(chuàng)建線程后,立即執(zhí)行該線程創(chuàng)建線程后,立即執(zhí)行該線程 &dwThreadID); if (hThreadWrite=NULL) AfxMessageBox(寫線程創(chuàng)建失??!

36、寫線程創(chuàng)建失?。?; 15.4.4 讀寫線程函數(shù)的建立 1讀線程函數(shù)讀線程函數(shù) 在讀線程函數(shù)中,首先應初始化重疊結(jié)構在讀線程函數(shù)中,首先應初始化重疊結(jié)構Rol的成員的成員hEvent,將其設置為無信號狀態(tài),將其設置為無信號狀態(tài)。當讀操作完成或出現(xiàn)通信錯誤時,該變量。當讀操作完成或出現(xiàn)通信錯誤時,該變量會被自動設置為有信號狀態(tài)。接下來就可以會被自動設置為有信號狀態(tài)。接下來就可以使用使用ReadFile()函數(shù)發(fā)出讀命令。若該讀函函數(shù)發(fā)出讀命令。若該讀函數(shù)返回數(shù)返回TRUE,說明讀操作已經(jīng)完成,可以處,說明讀操作已經(jīng)完成,可以處理讀取的數(shù)據(jù)。若該讀函數(shù)返回理讀取的數(shù)據(jù)。若該讀函數(shù)返回FALSE,說

37、,說明讀操作未完成。明讀操作未完成。 2寫線程函數(shù)寫線程函數(shù) 寫線程函數(shù)所作操作與讀線程函數(shù)的操寫線程函數(shù)所作操作與讀線程函數(shù)的操作相似。首先初始化作相似。首先初始化Wol的的hEvent事件成事件成員,然后發(fā)出寫命令員,然后發(fā)出寫命令WriteFile()。若該寫命。若該寫命令返回令返回TRUE,說明寫操作成功完成。若寫,說明寫操作成功完成。若寫命令返回命令返回FALSE,說明寫操作沒有完成。,說明寫操作沒有完成。 15.4.5 關閉串口 使用使用CloseHandle()函數(shù)關閉串口句柄。函數(shù)關閉串口句柄。 CloseHandle(hCom); 15.5 采用事件驅(qū)動方式的編程方法 主要介

38、紹在事件驅(qū)動方式下,實現(xiàn)串行通信主要介紹在事件驅(qū)動方式下,實現(xiàn)串行通信的編程方法。本節(jié)內(nèi)容涉及到重疊的編程方法。本節(jié)內(nèi)容涉及到重疊I/O操作、自定操作、自定義義Windows消息等概念。這些概念在與其相關的消息等概念。這些概念在與其相關的代碼中詳細說明。代碼中詳細說明。 這種方式的工作原理是建立一個事件線程,這種方式的工作原理是建立一個事件線程,它監(jiān)視串口的事件和錯誤信息。當有事件或錯誤它監(jiān)視串口的事件和錯誤信息。當有事件或錯誤發(fā)生時,它向主線程發(fā)送一個發(fā)生時,它向主線程發(fā)送一個Windows消息。主消息。主線程在消息響應函數(shù)中處理已發(fā)生的事件或錯誤線程在消息響應函數(shù)中處理已發(fā)生的事件或錯誤。采用這種方式編程,可以按照如下幾個步驟進。采用這種方式編程,可以按照如下幾個步驟進行,即:定義全局變量、創(chuàng)建串口、開啟事件線行,即:定義全局變量、創(chuàng)建串口、開啟事件線程、發(fā)送數(shù)據(jù)、自定義消息、關閉串口及關閉事程、發(fā)送數(shù)據(jù)、自定義消息、關閉串口及關閉事件線程。件線程。15.5.1 定義全局變量 在主對話框的實現(xiàn)文件(后綴名為在主對話框的實現(xiàn)文件(后綴名為cpp)中定義全局變量。通常在該文件的最頂)中定義全局變量。通常在該文件的最頂端定義,并在所有函數(shù)的外面。端定義,并在所有函數(shù)的外面。 15.5.2 打開串口及開啟事件線程 1打開串口打

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論