Visual C++程序設(shè)計教程(第二版)課件:串口通信程序的開發(fā)_第1頁
Visual C++程序設(shè)計教程(第二版)課件:串口通信程序的開發(fā)_第2頁
Visual C++程序設(shè)計教程(第二版)課件:串口通信程序的開發(fā)_第3頁
Visual C++程序設(shè)計教程(第二版)課件:串口通信程序的開發(fā)_第4頁
Visual C++程序設(shè)計教程(第二版)課件:串口通信程序的開發(fā)_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

串口通信程序的開發(fā)

12.1串口通信的內(nèi)部機(jī)制

應(yīng)用程序經(jīng)常要與外部設(shè)備進(jìn)行通信,這種通信通常是通過一個標(biāo)準(zhǔn)的并行口和兩個串行口進(jìn)行的。外部設(shè)備主要是與并行口相連的打印機(jī),與串口相連的調(diào)制解調(diào)器、鼠標(biāo)以及其他與串口、并口相連的儀器設(shè)備。12.1.1Windows串行通信的工作原理

常用的DOS系統(tǒng)主要是工作在響應(yīng)中斷方式。PC機(jī)串行通信程序大多利用其BIOS塊的INT14H中斷,以查詢串口的方式完成異步串行通信。 與DOS響應(yīng)中斷的工作方式不同,Windows是一個事件驅(qū)動的,并與設(shè)備無關(guān)的多用戶操作系統(tǒng)。同時Windows禁止應(yīng)用程序直接和硬件交互,程序員只能通過Windows提供的各類驅(qū)動程序來管理硬件。在這種情況下,Windows系統(tǒng)充當(dāng)了應(yīng)用程序與硬件之間的中介。12.1.2串行通信的操作方式下面介紹串行通信的幾種操作方式:1.同步方式 同步方式中,讀串口的函數(shù)試圖在串口的接收緩沖區(qū)中讀取規(guī)定數(shù)目的數(shù)據(jù),直到規(guī)定數(shù)目的數(shù)據(jù)全部被讀出或設(shè)定的超時時間已到時才返回。2.查詢方式 查詢方式,即一個進(jìn)程中的某一線程定時地查詢串口的接收緩沖區(qū),如果緩沖區(qū)中有數(shù)據(jù),就讀取數(shù)據(jù);若緩沖區(qū)中沒有數(shù)據(jù),該線程將繼續(xù)執(zhí)行,因此會占用大量的CPU時間,它實際上是同步方式的一種派生。3.異步方式 異步方式中,利用Windows的多線程結(jié)構(gòu),可以讓串口的讀寫操作在后臺進(jìn)行,而應(yīng)用程序的其他部分在前臺執(zhí)行。4.事件驅(qū)動方式 若對端口數(shù)據(jù)的響應(yīng)時間要求較嚴(yán)格,可采用事件驅(qū)動方式。事件驅(qū)動方式通過設(shè)置事件通知,當(dāng)所希望的事件發(fā)生時,Windows發(fā)出該事件已發(fā)生的通知,這與DOS環(huán)境下的中斷方式很相似。12.1.3單線程與多線程下的串口通信通常可按以下四步實現(xiàn)串行通信:按協(xié)議的設(shè)置初始化并打開串行口,這樣做就是通知Windows本應(yīng)用程序需要這個串口,并封鎖其他應(yīng)用程序使它們不能使用此串口。配置這個串口。在串口上往返地傳輸數(shù)據(jù),并在傳輸過程中進(jìn)行校驗。不需要此串口時,關(guān)閉串口。即釋放串口以供其它應(yīng)用程序使用。在這四個步驟中,主要的程序代碼集中在第(3)步。12.2串口通信的實現(xiàn)12.2.1串口的初始化

在Win32位環(huán)境中,串口和其它通訊設(shè)備都作為文件處理。串口的打開、關(guān)閉、讀取、寫入所用到的函數(shù)與文件操作所用到的函數(shù)相同。 串口通訊程序以調(diào)用CreateFile()函數(shù)開始,該函數(shù)的返回值是一個通信資源句柄,在隨后的其它端口操作中使用。 一旦當(dāng)端口處于打開狀態(tài),就可以自動分配一個發(fā)送/接收緩沖區(qū),當(dāng)然也可以調(diào)用SetComm()函數(shù)改變發(fā)送/接收緩沖區(qū)的大小。12.2.2串口的配置

當(dāng)用CreateFile函數(shù)打開一個串行通信資源句柄時,系統(tǒng)將根據(jù)資源最近一次被打開時的設(shè)置,來初始化和配置資源。如果設(shè)備從沒有被打開過,將使用系統(tǒng)的缺省值進(jìn)行配置。 設(shè)備控制塊(DeviceCentrolBlock,DCB)通過用戶編程,就可以實現(xiàn)對串口的配置。串行口和串行通信驅(qū)動程序是通過一個數(shù)據(jù)結(jié)構(gòu)進(jìn)行配置的,這個數(shù)據(jù)結(jié)構(gòu)被稱為設(shè)備控制塊(DeviceControlBlock),簡稱DCB。DCB結(jié)構(gòu)的成員,確定了資源配置的設(shè)置。12.2.3超時設(shè)置

通信資源句柄有一套影響讀寫操作的相關(guān)的超時參數(shù),當(dāng)一個超時后,就能引起各種操作的結(jié)束,即使指定數(shù)目的字符尚未讀寫完。在讀寫操作中發(fā)生超時并不作為錯誤處理。利用超時參數(shù)可以定義兩種超時:間隔超時-當(dāng)接收到相鄰字符的時間間隔超過給定的毫秒數(shù)時,間隔超時將發(fā)生。從接收第一個字符開始計時,當(dāng)接收到一個新的字符時重新開始計時??偭砍瑫r-當(dāng)讀寫花費(fèi)的時間操作超過計算出的毫秒數(shù)時,總量超時將發(fā)生。計時從I/O操作開始后立即進(jìn)行。寫操作只支持總量超時,讀操作支持兩種超時,可以單獨(dú)使用或組合使用。 超時參數(shù)的設(shè)置可以用COMMTIMEOUTS結(jié)構(gòu)實現(xiàn)。12.2.4串口的寫操作

在串口配置成功后,下一步就可以進(jìn)行讀/寫串口的操作了。寫串口程序相對比較簡單,調(diào)用WriteFile()函數(shù)就可以實現(xiàn)。函數(shù)調(diào)用的一個例子如下:

WriteFile(hCom1,out,length,&nToWrite,&o);

其中hCom1是串口的句柄,out為指向存儲寫入數(shù)據(jù)的緩沖區(qū),length表示要發(fā)送的數(shù)據(jù)長度,nToWrite為實際寫入的字節(jié)數(shù),&o為指向一個OVERLAPPED結(jié)構(gòu),使數(shù)據(jù)的寫操作在后臺進(jìn)行。12.2.5

串口的讀操作

實現(xiàn)讀串口的關(guān)鍵在于判斷何時去讀才能讀完全部的數(shù)據(jù)。首先用SetCommMask()函數(shù)設(shè)置的事件掩碼值為EV_CHAR,使WaitCommEvent()函數(shù)能夠在接收到一個字符,并放入輸入緩沖區(qū),從而退出等待。再利用ClearCommError()函數(shù)得到一個COMSTAT結(jié)構(gòu),而其中在COMSTAT的成員變量cbInQue為接收緩沖區(qū)中實際的數(shù)據(jù)數(shù)。只要WaitCommEvent()函數(shù)結(jié)束等待狀態(tài),程序就繼續(xù)執(zhí)行。下一步,判斷輸入緩沖區(qū)是否為零,如不是就可以開始讀串口的操作。 讀串口使用ReadFile()函數(shù),一個調(diào)用的例子如下:

ReadFile(hCom1,input,cs.cbInQue,&nBytesRead,&o);12.2.5

串口的讀操作(續(xù))

在這里還使用了幾個其它的函數(shù),下面也將介紹:SetCommMask(hCom1,EV_RXCHAR);WaitCommEvent(hCom1,&dwEvent,NULL);ClearCommError(hCom1,&dwError,&cs);12.2.6關(guān)閉串口

在程序執(zhí)行完,退回到Windows環(huán)境時,要關(guān)閉串口,以便其它程序能使用。關(guān)閉串口很簡單,用下面函數(shù)實現(xiàn):

CloseHandle(hCom1); //hCom1為串口的句柄。12.3串口通信程序舉例

本節(jié)講述一個具體的串口通信的實例,該實例是在工控以太網(wǎng)通信協(xié)議解密所用到的一個串口通信程序,這里實現(xiàn)的是通信協(xié)議解密的軟件部分。 該軟件設(shè)計的目的就是接收來自過程級和監(jiān)控級兩處發(fā)送的信號,也就是它們互答的通訊的協(xié)議。即該軟件的功能在于從串口1和串口2接收數(shù)據(jù),從串口1接收過程級的數(shù)據(jù),從串口2接收監(jiān)控級的數(shù)據(jù)。由于監(jiān)控級和過程級的通信是突發(fā)或連續(xù)的,實時性較高,為了防止任何數(shù)據(jù)的丟失,這里將采用多線程技術(shù)。12.3.1建立基于對話框的程序

建立基于對話框的程序Eg12_1,刪除對話框資源默認(rèn)的一個靜態(tài)控件和兩個按鈕控件。修改對話框資源的Properties屬性。12.3.2添加控件在對話框資源上添加如下表12.1所示控件。12.3.3為控件建立相關(guān)聯(lián)的成員變量如表12.2所示:

12.3.4建立按鈕的消息響應(yīng)函數(shù)voidCEg12_1Dlg::OnConfig(){ //TODO:Addyourcontrolnotificationhandlercodehere

COMMCONFIGcc; cc.dcb=dcb; if(!CommConfigDialog("com1",GetSafeHwnd(),&cc))return;

dcb=cc.dcb; SetCommState(hCom12,&dcb); }12.3.5重載對話框類的初始化函數(shù)OnInitDialog()函數(shù)第一步,在初始化以前需要定義程序用到的結(jié)構(gòu)和變量第二步,把串口的初始化、配置放在對話框類的OnInitDialog()函數(shù)中。第三步,啟動讀線程。在初始化串口后,就要啟動讀線程進(jìn)行監(jiān)控串口。因此,把啟動讀線程程序放在了對話框類的OnInitDialog()函數(shù)的最后。線程啟動程序如下:voidCEg12_1Dlg::OnReceive(){//定義一個句柄,用于讀線程。HWNDhWndread=GetSafeHwnd();//啟動讀線程.AfxBeginThread(ReadProc,hWndread,THREAD_PRIORITY_NORMAL);//在這里ReadProc就是讀線程程序}第四步,加入用戶自定義消息12.3.6程序運(yùn)行結(jié)果運(yùn)行程序,點擊按鈕“配置

溫馨提示

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

評論

0/150

提交評論