




已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
用Win32API實現(xiàn)串行通信南京航空航天大學(xué)牛新莊-串口是常用的計算機(jī)與外部串行設(shè)備之間的數(shù)據(jù)傳輸通道,由于串行通信方便易行,所以應(yīng)用廣泛。我們可以利用WindowsAPI提供的通信函數(shù)編寫出高可移植性的串行通信程序。在Win16中,可以利用OpenComm、CloseComm和WriteComm等函數(shù)打開、關(guān)閉和讀寫串口。但在Win32中,串口和其他通信設(shè)備均被作為文件處理,串口的打開、關(guān)閉和讀寫等操作所用的API函數(shù)與操作文件的函數(shù)相同??赏ㄟ^CreateFile函數(shù)打開串口,通過CloseFile函數(shù)關(guān)閉串口,通過CommProp、DCB結(jié)構(gòu)、GetCommProperties、SetCommProperties、GetCommState及SetCommState等函數(shù)設(shè)置串口狀態(tài),通過函數(shù)ReadFile和WritFile讀寫串口。VC6.0是Windows應(yīng)用程序開發(fā)的主流語言之一,它具有良好的圖形設(shè)計界面并支持面向?qū)ο蟮某绦蛟O(shè)計方法。本文結(jié)合一個實例介紹在VC6.0下如何利用Win32API實現(xiàn)串行通信程序。實現(xiàn)原理本文的實例來自一個水泥發(fā)貨系統(tǒng),在系統(tǒng)中,需要將通過總量傳感器采集到的倉重值傳入到計算機(jī)中,以便系統(tǒng)做出相應(yīng)的處理。這需要使用串行通信來完成采集數(shù)據(jù)的傳遞工作。對于串行通信設(shè)備,Win32API支持同步和異步兩種I/O操作。同步操作方式的程序設(shè)計相對比較簡單,但I(xiàn)/O操作函數(shù)在I/O操作結(jié)束前不能返回,這將掛起調(diào)用線程,直到I/O操作結(jié)束。異步操作方式相對要復(fù)雜一些,但它可讓耗時的I/O操作在后臺進(jìn)行,不會掛起調(diào)用線程,這在大數(shù)據(jù)量通信的情況下對改善調(diào)用線程的響應(yīng)速度是相當(dāng)有效的。異步操作方式特別適合同時對多個串行設(shè)備進(jìn)行I/O操作和同時對一個串行設(shè)備進(jìn)行讀/寫操作。這兩種操作方式的程序設(shè)計基本思想是相似的,本文將針對同步操作方式給出具體的通信程序設(shè)計,同時簡單說明如何實現(xiàn)異步的I/O操作。串行設(shè)備的初始化串行設(shè)備的初始化是利用CreateFile函數(shù)實現(xiàn)的。該函數(shù)獲得串行設(shè)備句柄并對其進(jìn)行通信參數(shù)設(shè)置,包括設(shè)置輸出/接收緩沖區(qū)大小、超時控制和事件監(jiān)視等。/串行設(shè)備句柄;HANDLEhComDev=0;/串口打開標(biāo)志;BOOLbOpen=FALSE;/線程同步事件句柄;HANDLEhEvent=0;BOOLSetupSynCom()DCBdcb;COMMTIMEOUTStimeouts;/設(shè)備已打開if(bOpen)returnFALSE;/打開COM1if(hComDev=CreateFile(“COM1”,GENERICREAD|GENERICWRITE,0,NULL,OPENEXISTING,FILEATTRIBUTENORMAL,NULL)=INVALIDHANDLEVALUE)returnFALSE;/設(shè)置超時控制SetCommTimeouts(hComDev,timeouts);/設(shè)置接收緩沖區(qū)和輸出緩沖區(qū)的大小SetupComm(hComDev,1024,512);/獲取缺省的DCB結(jié)構(gòu)的值GetCommState(hComDev,dcb);/設(shè)定波特率為9600bpsdcb.BaudRate=CBR9600;/設(shè)定無奇偶校驗dcb.fParity=NOPARITY;/設(shè)定數(shù)據(jù)位為8dcb.ByteSize=8;/設(shè)定一個停止位dcb.StopBits=ONESTOPBIT;/監(jiān)視串口的錯誤和接收到字符兩種事件SetCommMask(hComDev,EVERR|EVRXCHAR);/設(shè)置串行設(shè)備控制參數(shù)SetCommState(hComDev,dcb);/設(shè)備已打開bOpen=TRUE;/創(chuàng)建人工重設(shè)、未發(fā)信號的事件hEvent=CreateEvent(NULL,FALSE,FALSE,“WatchEvent”);/創(chuàng)建一個事件監(jiān)視線程來監(jiān)視串口事件AfxBeginThread(CommWatchProc,pParam);在設(shè)置串口DCB結(jié)構(gòu)的參數(shù)時,不必設(shè)置每一個值。首先讀出DCB缺省的參數(shù)設(shè)置,然后只修改必要的參數(shù),其他參數(shù)都取缺省值。由于對串口進(jìn)行的是同步I/O操作,所以除非指定進(jìn)行監(jiān)測的事件發(fā)生,否則WaitCommEvent函數(shù)不會返回。在串行設(shè)備初始化的最后要建立一個單獨的監(jiān)視線程來監(jiān)視串口事件,以免掛起當(dāng)前調(diào)用線程,其中pParam可以是一個對事件進(jìn)行處理的窗口類指針。如果要進(jìn)行異步I/O操作,打開設(shè)備句柄時,CreateFile的第6個參數(shù)應(yīng)增加FILEFLAGOVERLAPPED標(biāo)志。數(shù)據(jù)發(fā)送數(shù)據(jù)發(fā)送利用WriteFile函數(shù)實現(xiàn)。對于同步I/O操作,它的最后一個參數(shù)可為NULL;而對異步I/O操作,它的最后一個參數(shù)必需是一個指向OVERLAPPED結(jié)構(gòu)的指針,通過OVERLAPPED結(jié)構(gòu)來獲得當(dāng)前的操作狀態(tài)。BOOLWriteComm(LPCVOIDlpSndBuffer,DWORDdwBytesToWrite)/lpSndBuffer為發(fā)送數(shù)據(jù)緩沖區(qū)指針,dwBytesToWrite為將要發(fā)送的字節(jié)長度/設(shè)備已打開BOOLbWriteState;/實際發(fā)送的字節(jié)數(shù)DWORDdwBytesWritten;/設(shè)備未打開if(!bOpen)returnFALSE;bWriteState=WriteFile(hComDev,lpSndBuffer,dwBytesToWrite,dwBytesWritten,NULL);if(!bWriteState|dwBytesToWrite!=dwBytesWritten)/發(fā)送失敗returnFALSE;else/發(fā)送成功returnTRUE;數(shù)據(jù)接收接收數(shù)據(jù)的任務(wù)由ReadFile函數(shù)完成。該函數(shù)從串口接收緩沖區(qū)中讀取數(shù)據(jù),讀取數(shù)據(jù)前,先用ClearCommError函數(shù)獲得接收緩沖區(qū)中的字節(jié)數(shù)。接收數(shù)據(jù)時,同步和異步讀取的差別同發(fā)送數(shù)據(jù)是一樣的。DWORDReadComm(LPVOIDlpInBuffer,DWORDdwBytesToRead)/lpInBuffer為接收數(shù)據(jù)的緩沖區(qū)指針,dwBytesToRead為準(zhǔn)備讀取的數(shù)據(jù)長度(字節(jié)數(shù))/串行設(shè)備狀態(tài)結(jié)構(gòu)COMSTATComStat;DWORDdwBytesRead,dwErrorFlags;/設(shè)備未打開if(!bOpen)return0;/讀取串行設(shè)備的當(dāng)前狀態(tài)ClearCommError(hComDev,dwErrorFlags,ComStat);/應(yīng)該讀取的數(shù)據(jù)長度dwBytesRead=min(dwBytesToRead,ComStat.cbInQue);if(dwBytesRead0)/讀取數(shù)據(jù)if(!ReadFile(hComDev,lpInBuffer,dwBytesRead,dwBytesRead,NULL)dwBytesRead=0;returndwBytesRead;事件監(jiān)視線程事件監(jiān)視線程對串口事件進(jìn)行監(jiān)視,當(dāng)監(jiān)視的事件發(fā)生時,監(jiān)視線程可將這個事件發(fā)送(SendMessage)或登記(PostMessage)到對事件進(jìn)行處理的窗口類(由pParam指定)中。UINTCommWatchProc(LPVOIDpParam)DWORDdwEventMask=0;/發(fā)生的事件;while(bOpen)/等待監(jiān)視的事件發(fā)生WaitCommEvent(hComDev,dwEventMask,NULL);if(dwEventMaskEVRXCHAR)=EVRXCHAR)/接收到字符事件后,可以將此消息登記到由pParam有指定的窗口類中進(jìn)行處理if(dwEventMaskEVERR)=EVERROR/發(fā)生錯誤時的處理SetEvent(hEvent);/發(fā)信號,指示監(jiān)視線程結(jié)束return0;關(guān)閉串行設(shè)備在整個應(yīng)用程序結(jié)束或不再使用串行設(shè)備時,應(yīng)將串行設(shè)備關(guān)閉,包括取消事件監(jiān)視,將設(shè)備打開標(biāo)志bOpen置為FALSE以使事件監(jiān)視線程結(jié)束,清除發(fā)送/接收緩沖區(qū)和關(guān)閉設(shè)備句柄。voidCloseSynComm()if(!bOpen)return;/結(jié)束事件監(jiān)視線程bOpen=FALSE;SetCommMask(hComDev,0);/取消事件監(jiān)視,此時監(jiān)視線程中的WaitCommEvent將返回WaitForSingleObject(hEvent,INFINITE);/等待監(jiān)視線程結(jié)束CloseHandle(hEvent);/關(guān)閉事件句柄/停止發(fā)送和接收數(shù)據(jù),并清除發(fā)送和接收緩沖區(qū)PurgeComm(hComDev,PURGE-TXABORT|PURGE-RXABORT|PURGE-TXCLEAR|PURGE-RXCLEAR);/關(guān)閉設(shè)備句柄Clo
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高標(biāo)準(zhǔn)廠房租賃安全生產(chǎn)及環(huán)境保護(hù)管理協(xié)議
- 餐飲公司股東投資收益分配合同
- 拆除工程安全責(zé)任及補(bǔ)償協(xié)議范本
- 車輛租賃平臺傭金分成合同
- 互聯(lián)網(wǎng)教育代理記帳與課程資源整合合同
- 資源開發(fā)項目參股合作協(xié)議范本
- 產(chǎn)權(quán)拍賣合同范本
- 餐飲店拆伙退伙協(xié)議書(合同解除原因)
- 美食街特色餐飲攤位租賃及食品安全保障合同
- 特種礦產(chǎn)資源采礦權(quán)出讓與科研開發(fā)合同
- 鹽城市區(qū)第Ⅲ防洪區(qū)水環(huán)境綜合治理PPP項目Ⅱ標(biāo)段“6·4”一般基坑坍塌事故調(diào)查報告
- 電機(jī)振動測定方法及限值振動測定方法
- 濟(jì)南遙墻機(jī)場擴(kuò)建工程航站樓建設(shè)監(jiān)理大綱
- 撥叉綜合課程設(shè)計
- 七年級上冊數(shù)學(xué)知識點總結(jié)及精編例題1
- 學(xué)校物業(yè)服務(wù)監(jiān)督及處罰辦法
- 心內(nèi)科高危藥物安全管理與指引
- 2012《天津市安裝工程預(yù)算基價》電氣工程(預(yù)算基價導(dǎo)出)
- 1104基礎(chǔ)報表填報說明(最新)
- 老舊小區(qū)改造技術(shù)標(biāo)-
- 分支型室速的導(dǎo)管消融術(shù)ppt課件
評論
0/150
提交評論