




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第12章 串口通信程序的開發(fā)12.1 串口通信的內(nèi)部機(jī)制 應(yīng)用程序經(jīng)常要與外部設(shè)備進(jìn)行通信,這種通信通常是通過一個(gè)標(biāo)準(zhǔn)的并行口和兩個(gè)串行口進(jìn)行的。外部設(shè)備主要是與并行口相連的打印機(jī),與串口相連的調(diào)制解調(diào)器、鼠標(biāo)以及其他與串口、并口相連的儀器設(shè)備。 12.1.1 Windows串行通信的工作原理串行通信的工作原理常用的DOS系統(tǒng)主要是工作在響應(yīng)中斷方式。PC機(jī)串行通信程序大多利用其BIOS塊的INT14H中斷,以查詢串口的方式完成異步串行通信。與DOS響應(yīng)中斷的工作方式不同,Windows是一個(gè)事件驅(qū)動(dòng)的,并與設(shè)備無關(guān)的多用戶操作系統(tǒng)。同時(shí)Windows禁止應(yīng)用程序直接和硬件交互,程序員只能通過
2、Windows提供的各類驅(qū)動(dòng)程序來管理硬件。在這種情況下,Windows系統(tǒng)充當(dāng)了應(yīng)用程序與硬件之間的中介。 12.1.2 串行通信的操作方式下面介紹串行通信的幾種操作方式:l1.同步方式同步方式中,讀串口的函數(shù)試圖在串口的接收緩沖區(qū)中讀取規(guī)定數(shù)目的數(shù)據(jù),直到規(guī)定數(shù)目的數(shù)據(jù)全部被讀出或設(shè)定的超時(shí)時(shí)間已到時(shí)才返回。l2.查詢方式查詢方式,即一個(gè)進(jìn)程中的某一線程定時(shí)地查詢串口的接收緩沖區(qū),如果緩沖區(qū)中有數(shù)據(jù),就讀取數(shù)據(jù);若緩沖區(qū)中沒有數(shù)據(jù),該線程將繼續(xù)執(zhí)行,因此會(huì)占用大量的CPU時(shí)間,它實(shí)際上是同步方式的一種派生。l3.異步方式異步方式中,利用Windows的多線程結(jié)構(gòu),可以讓串口的讀寫操作在后臺(tái)
3、進(jìn)行,而應(yīng)用程序的其他部分在前臺(tái)執(zhí)行。l4.事件驅(qū)動(dòng)方式若對(duì)端口數(shù)據(jù)的響應(yīng)時(shí)間要求較嚴(yán)格,可采用事件驅(qū)動(dòng)方式。事件驅(qū)動(dòng)方式通過設(shè)置事件通知,當(dāng)所希望的事件發(fā)生時(shí),Windows發(fā)出該事件已發(fā)生的通知,這與DOS環(huán)境下的中斷方式很相似。 12.1.3 單線程與多線程下的串口通信通常可按以下四步實(shí)現(xiàn)串行通信:l按協(xié)議的設(shè)置初始化并打開串行口,這樣做就是通知Windows本應(yīng)用程序需要這個(gè)串口,并封鎖其他應(yīng)用程序使它們不能使用此串口。l 配置這個(gè)串口。l在串口上往返地傳輸數(shù)據(jù),并在傳輸過程中進(jìn)行校驗(yàn)。l不需要此串口時(shí),關(guān)閉串口。即釋放串口以供其它應(yīng)用程序使用。在這四個(gè)步驟中,主要的程序代碼集中在第(
4、3)步。 12.2 串口通信的實(shí)現(xiàn)串口通信的實(shí)現(xiàn) 12.2.1 串口的初始化在Win32位環(huán)境中,串口和其它通訊設(shè)備都作為文件處理。串口的打開、關(guān)閉、讀取、寫入所用到的函數(shù)與文件操作所用到的函數(shù)相同。串口通訊程序以調(diào)用CreateFile()函數(shù)開始,該函數(shù)的返回值是一個(gè)通信資源句柄,在隨后的其它端口操作中使用。 一旦當(dāng)端口處于打開狀態(tài),就可以自動(dòng)分配一個(gè)發(fā)送/接收緩沖區(qū),當(dāng)然也可以調(diào)用SetComm()函數(shù)改變發(fā)送/接收緩沖區(qū)的大小。 12.2.2 串口的配置串口的配置當(dāng)用CreateFile函數(shù)打開一個(gè)串行通信資源句柄時(shí),系統(tǒng)將根據(jù)資源最近一次被打開時(shí)的設(shè)置,來初始化和配置資源。如果設(shè)備從
5、沒有被打開過,將使用系統(tǒng)的缺省值進(jìn)行配置。設(shè)備控制塊(Device Centrol Block,DCB)通過用戶編程,就可以實(shí)現(xiàn)對(duì)串口的配置。串行口和串行通信驅(qū)動(dòng)程序是通過一個(gè)數(shù)據(jù)結(jié)構(gòu)進(jìn)行配置的,這個(gè)數(shù)據(jù)結(jié)構(gòu)被稱為設(shè)備控制塊( Device Control Block ),簡(jiǎn)稱DCB。DCB結(jié)構(gòu)的成員,確定了資源配置的設(shè)置。 12.2.3 超時(shí)設(shè)置超時(shí)設(shè)置 通信資源句柄有一套影響讀寫操作的相關(guān)的超時(shí)參數(shù),當(dāng)一個(gè)超時(shí)后,就能引起各種操作的結(jié)束,即使指定數(shù)目的字符尚未讀寫完。在讀寫操作中發(fā)生超時(shí)并不作為錯(cuò)誤處理。利用超時(shí)參數(shù)可以定義兩種超時(shí):l間隔超時(shí)當(dāng)接收到相鄰字符的時(shí)間間隔超過給定的毫秒數(shù)時(shí),
6、間隔超時(shí)將發(fā)生。從接收第一個(gè)字符開始計(jì)時(shí),當(dāng)接收到一個(gè)新的字符時(shí)重新開始計(jì)時(shí)。l 總量超時(shí)當(dāng)讀寫花費(fèi)的時(shí)間操作超過計(jì)算出的毫秒數(shù)時(shí),總量超時(shí)將發(fā)生。計(jì)時(shí)從I/O操作開始后立即進(jìn)行。寫操作只支持總量超時(shí),讀操作支持兩種超時(shí),可以單獨(dú)使用或組合使用。超時(shí)參數(shù)的設(shè)置可以用COMMTIMEOUTS結(jié)構(gòu)實(shí)現(xiàn)。12.2.4 串口的寫操作串口的寫操作在串口配置成功后,下一步就可以進(jìn)行讀/寫串口的操作了。寫串口程序相對(duì)比較簡(jiǎn)單,調(diào)用WriteFile()函數(shù)就可以實(shí)現(xiàn)。函數(shù)調(diào)用的一個(gè)例子如下:WriteFile(hCom1,out,length,&nToWrite,&o);其中hCom1是串口
7、的句柄,out為指向存儲(chǔ)寫入數(shù)據(jù)的緩沖區(qū),length表示要發(fā)送的數(shù)據(jù)長(zhǎng)度,nToWrite為實(shí)際寫入的字節(jié)數(shù),&o為指向一個(gè)OVERLAPPED結(jié)構(gòu),使數(shù)據(jù)的寫操作在后臺(tái)進(jìn)行。 12.2.5 串口的讀操作串口的讀操作實(shí)現(xiàn)讀串口的關(guān)鍵在于判斷何時(shí)去讀才能讀完全部的數(shù)據(jù)。首先用SetCommMask()函數(shù)設(shè)置的事件掩碼值為EV_CHAR,使WaitCommEvent()函數(shù)能夠在接收到一個(gè)字符,并放入輸入緩沖區(qū),從而退出等待。再利用ClearCommError()函數(shù)得到一個(gè)COMSTAT結(jié)構(gòu),而其中在COMSTAT的成員變量cbInQue為接收緩沖區(qū)中實(shí)際的數(shù)據(jù)數(shù)。只要WaitCom
8、mEvent()函數(shù)結(jié)束等待狀態(tài),程序就繼續(xù)執(zhí)行。下一步,判斷輸入緩沖區(qū)是否為零,如不是就可以開始讀串口的操作。讀串口使用ReadFile()函數(shù),一個(gè)調(diào)用的例子如下:ReadFile(hCom1,input,cs.cbInQue,&nBytesRead,&o); 12.2.5 串口的讀操作(續(xù))串口的讀操作(續(xù)) 在這里還使用了幾個(gè)其它的函數(shù),下面也將介紹:lSetCommMask(hCom1,EV_RXCHAR);lWaitCommEvent(hCom1,&dwEvent,NULL); lClearCommError(hCom1,&dwError,&
9、cs);12.2.6 關(guān)閉串口關(guān)閉串口在程序執(zhí)行完,退回到Windows環(huán)境時(shí),要關(guān)閉串口,以便其它程序能使用。關(guān)閉串口很簡(jiǎn)單,用下面函數(shù)實(shí)現(xiàn):CloseHandle(hCom1); /hCom1為串口的句柄。 12.3 串口通信程序舉例串口通信程序舉例本節(jié)講述一個(gè)具體的串口通信的實(shí)例,該實(shí)例是在工控以太網(wǎng)通信協(xié)議解密所用到的一個(gè)串口通信程序,這里實(shí)現(xiàn)的是通信協(xié)議解密的軟件部分。該軟件設(shè)計(jì)的目的就是接收來自過程級(jí)和監(jiān)控級(jí)兩處發(fā)送的信號(hào),也就是它們互答的通訊的協(xié)議。即該軟件的功能在于從串口1和串口2接收數(shù)據(jù),從串口1接收過程級(jí)的數(shù)據(jù),從串口2接收監(jiān)控級(jí)的數(shù)據(jù)。由于監(jiān)控級(jí)和過程級(jí)的通信是突發(fā)或連續(xù)
10、的,實(shí)時(shí)性較高,為了防止任何數(shù)據(jù)的丟失,這里將采用多線程技術(shù)。12.3.1 建立基于對(duì)話框的程序建立基于對(duì)話框的程序建立基于對(duì)話框的程序Eg12_1,刪除對(duì)話框資源默認(rèn)的一個(gè)靜態(tài)控件和兩個(gè)按鈕控件。修改對(duì)話框資源的Properties屬性。 12.3.2 添加控件添加控件l在對(duì)話框資源上添加如下表12.1所示控件。12.3.3 為控件建立相關(guān)聯(lián)的成員變量l如表如表12.2所示:所示:12.3.4 建立按鈕的消息響應(yīng)函數(shù)lvoid CEg12_1Dlg:OnConfig() ll/ TODO: Add your control notification handler code herelCOM
11、MCONFIG cc;lcc.dcb=dcb;lif(!CommConfigDialog(com1,GetSafeHwnd(),&cc) return;lldcb=cc.dcb;lSetCommState(hCom12,&dcb);l12.3.5 重載對(duì)話框類的初始化函數(shù)OnInitDialog()函數(shù)l第一步,在初始化以前需要定義程序用到的結(jié)構(gòu)和變量l第二步,把串口的初始化、配置放在對(duì)話框類的OnInitDialog()函數(shù)中。l第三步,啟動(dòng)讀線程。在初始化串口后,就要啟動(dòng)讀線程進(jìn)行監(jiān)控串口。因此,把啟動(dòng)讀線程程序放在了對(duì)話框類的OnInitDialog()函數(shù)的最后。l線程啟動(dòng)程序如下:lvoid CEg12_1Dlg:OnReceive()ll/定義一個(gè)句柄,用于讀線程。定義一個(gè)句柄,用于讀線程。lHWND hWndread=GetSafeHwnd();/啟動(dòng)讀線程啟動(dòng)讀線程.lAfxBeginThread(ReadProc,hWndread,THREAD_PRIORITY_NORMAL); l/在這里ReadProc就是讀線程程序ll第四步,加入用戶自定義消息12.3.6 程序運(yùn)行結(jié)果程序運(yùn)行結(jié)果l運(yùn)行程序,點(diǎn)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《貴州飛尚能源有限公司六枝特區(qū)興旺煤礦(變更)礦產(chǎn)資源綠色開發(fā)利用方案(三合一)》評(píng)審意見
- 珠寶相關(guān)知識(shí)培訓(xùn)課件
- 2025年汕尾下載b2貨運(yùn)從業(yè)資格證模擬考試考試
- 印度課件+-2024-2025學(xué)年人教版七年級(jí)地理下冊(cè)
- 養(yǎng)殖寵物基本知識(shí)培訓(xùn)課件
- 第二單元空氣和氧氣課題3制取氧氣 第1課時(shí)實(shí)驗(yàn)室制取氧氣的原理 分解反應(yīng)教學(xué)設(shè)計(jì)-2024-2025學(xué)年九年級(jí)化學(xué)人教版(2024)上冊(cè)
- 2025年西藏貨運(yùn)從業(yè)證考試內(nèi)容
- 四川省南川區(qū)川東北名校2024-2025學(xué)年高二(上)期末物理試卷【含解析】
- 上海市靜安區(qū)華東模范中學(xué)2024-2025學(xué)年高一(上)期末物理試卷【含解析】
- 2025屆新高考?xì)v史沖刺熱點(diǎn)復(fù)習(xí)中華文明的形成和發(fā)展時(shí)期-秦漢
- 2024中陜核(西安)文化傳媒有限公司招聘(11人)筆試參考題庫附帶答案詳解
- 2024年世界職業(yè)院校技能大賽中職組“法律實(shí)務(wù)組”賽項(xiàng)考試題庫(含答案)
- 廣西桂林市2024-2025學(xué)年八年級(jí)上學(xué)期期末考試物理試題(含答案)
- 2025年延安職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫完整
- 2025年皖西衛(wèi)生職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫及參考答案
- 2025年復(fù)工復(fù)產(chǎn)培訓(xùn)考核試卷及答案
- 2025年上半年度國(guó)家鐵路局機(jī)關(guān)服務(wù)中心公開招聘應(yīng)屆畢業(yè)生2人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 《新會(huì)計(jì)法解讀》課件
- 南寧市良慶區(qū)招聘專職化城市社區(qū)工作者筆試真題2024
- 2024年西安航空職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試歷年參考題庫含答案解析
- 臨平區(qū)九年級(jí)上學(xué)期期末考試語文試題(PDF版含答案)
評(píng)論
0/150
提交評(píng)論