第5章 串口的讀寫和緩沖區(qū)數(shù)據(jù)的顯示.doc_第1頁
第5章 串口的讀寫和緩沖區(qū)數(shù)據(jù)的顯示.doc_第2頁
第5章 串口的讀寫和緩沖區(qū)數(shù)據(jù)的顯示.doc_第3頁
第5章 串口的讀寫和緩沖區(qū)數(shù)據(jù)的顯示.doc_第4頁
第5章 串口的讀寫和緩沖區(qū)數(shù)據(jù)的顯示.doc_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第5章串口的讀寫和緩沖區(qū)數(shù)據(jù)的顯示33第5章串口的讀寫和緩沖區(qū)數(shù)據(jù)的顯示利用WIN32API讀寫串口時(shí),既可以同步執(zhí)行,也可以重疊(異步)執(zhí)行。在同步執(zhí)行時(shí),函數(shù)直接操作完成后才返回。這意味著同步執(zhí)行時(shí)線程會(huì)被阻塞,從而導(dǎo)致效率降低,在重疊執(zhí)行時(shí),即使操作未完成,調(diào)用的函數(shù)也會(huì)立即返回。費(fèi)時(shí)的I/O操作在后臺(tái)進(jìn)行這樣線程就可以做其他工作。例如線程可以在不同的句柄上執(zhí)行I/O操作,甚至可以在同一句柄上同時(shí)進(jìn)行讀寫操作?!爸丿B”一詞含義就在于此。5.1讀串口操作程序可以使用WIN32APIReadFile()函數(shù)從串口讀取數(shù)據(jù)。ReadFile()函數(shù)聲明如下:BOOLReadFile(HANDLEhFile,/指向標(biāo)識(shí)的句柄LPVOIDlpBuffer,/指向一個(gè)緩沖區(qū)DWORDnNumberOfBytesToRead,/讀取的字節(jié)數(shù)LPDWORDlpNumberOfBytesRead,/指向調(diào)用該函數(shù)讀出的字節(jié)數(shù)LPOVERLAPPEDlpOverlapped/一個(gè)OVERLAPPED的結(jié)構(gòu))其中主要參數(shù)介紹如下:hFile:指向標(biāo)識(shí)的句柄。對(duì)串口來說,就是由CreateFile()函數(shù)返回的句柄。該句柄需擁有GENERICREAD的權(quán)限。lpBuffer:指向一個(gè)緩沖區(qū)、該緩沖區(qū)主要用于存放從串口設(shè)備中讀取的數(shù)據(jù)。nNumberOfBytesToRead:指定要從串口設(shè)備讀取的字節(jié)數(shù)lpNumberOfBytesRead:指向調(diào)用該函數(shù)讀出的字節(jié)數(shù)。ReadFile()在讀操作前,首先將其設(shè)置為0。WindowsNT/2000中當(dāng)lpOverlapped沒有設(shè)置時(shí),lpNumberOfBytesRead必需設(shè)置。當(dāng)lpOverlapped設(shè)置時(shí),lpNumberOfBytesRead可以不設(shè)置。這是可以調(diào)用GetOverlappedResult()函數(shù)獲取實(shí)際的讀取數(shù)值。Windows9x中這個(gè)參數(shù)一定要設(shè)置.lpOverlapped:是一個(gè)0VERLAPPED的結(jié)構(gòu),如果hFile以燕山大學(xué)工學(xué)學(xué)士學(xué)位論文34FILE_FLAG_OVERLAPPED方式常見,則需要此結(jié)構(gòu);否則,不需要此結(jié)構(gòu)。5.2寫串口操作可以使用WIN32API函數(shù)WriteFile()向串口中寫數(shù)據(jù)。WriteFile()的數(shù)聲明如下:BOOLWriteFile(HANDLEhFile,/指向標(biāo)識(shí)的句柄LPVOIDlpBuffer,/指向一個(gè)緩沖區(qū)DWORDnNumberOfBytesToWrite,/指定要向串口設(shè)備寫入的z字節(jié)數(shù)LPDWORDlpNumbersOfBytesWritten,/指向調(diào)用該函數(shù)已寫入的字節(jié)數(shù)LPOVERLAPPEDllpOverlapped/一個(gè)OVERLAPPED的結(jié)構(gòu));其中主要參數(shù)介紹如下:hFile:指向標(biāo)識(shí)的句柄。對(duì)串口來說,就是由CreateFile()函數(shù)返回的句柄。該句柄需擁有GENERICWRITE的權(quán)限。pBuffer:指向一個(gè)緩沖區(qū),該緩沖區(qū)主要用來存放待寫入串口設(shè)備的數(shù)據(jù)。nNumberOfBytesToWrite:指定要向串口設(shè)備寫入的字節(jié)數(shù)。lpNumbersOfBytesWritten:指向調(diào)用該函數(shù)已寫入出的字節(jié)數(shù)。WriteFiIe()在寫操作前,首先將其設(shè)置為0。WindowsNT2000中當(dāng)lpOverlapped沒有設(shè)置時(shí),lpNumbersOfBytesWritten必需設(shè)置,當(dāng)lpOverlapped設(shè)置時(shí),lpNumbersOfBytesWritten可以不設(shè)置。這時(shí)可以調(diào)用GetOverlappedResult()函數(shù)獲取實(shí)際讀取數(shù)值。Windows9x中這個(gè)參數(shù)一定要設(shè)置。lpOverlapped:是一個(gè)OVERLAPPED的結(jié)構(gòu),如果hFile以FILE_FLAS_OVERLAPPED方式常見,則需要此結(jié)構(gòu);否則,不需要此結(jié)構(gòu)。第5章串口的讀寫和緩沖區(qū)數(shù)據(jù)的顯示355.3異步I/O操作異步(重疊)I/O操作是指應(yīng)用程序可以在后臺(tái)讀或者寫數(shù)據(jù)而在前臺(tái)做其他事情。例如,用程序可以在開始時(shí)對(duì)1000個(gè)數(shù)據(jù)進(jìn)行讀或?qū)懖僮?,然后返回?zhí)行其他的操作;在讀寫完成后,Windows就會(huì)產(chǎn)個(gè)一個(gè)信號(hào),應(yīng)用程序得到這個(gè)信號(hào),便可以進(jìn)行其他讀寫操作。要使用OVERLAPPED結(jié)構(gòu),CreateFile()函數(shù)的fdwAttrsAndFlags參數(shù)必須設(shè)置為FILE_FLAG_OVERLAPPED標(biāo)識(shí),讀寫串口函數(shù)必須指定OVERLAPPED結(jié)構(gòu)。異步I/O操作在Windows中使用廣泛。OVERLAPPED結(jié)構(gòu)類型聲明如下:typedefstruct_OVERLAPPEDDWORDInternal;DWORDInternalHigh;DWORDOffset;DWORDOffsetHigh;HANDLEhEvent;OVERLAPPED;其中主要參數(shù)如下:Internal:操作系統(tǒng)保留,指出一個(gè)和系統(tǒng)相關(guān)的狀態(tài)當(dāng)GetOverlappedResult()函數(shù)返回時(shí),如果將擴(kuò)展信息設(shè)置為ERROR_IO_PENDING,該參數(shù)有效。InternalHigh:操作系統(tǒng)保留,指出發(fā)送或接收的數(shù)據(jù)長(zhǎng)度。當(dāng)GetOverlappedResult()函數(shù)返回值不為0時(shí),該參牧有效。Offset和OffsetHigh:指明文件傳送的開始位置和字節(jié)偏移量的高位字。當(dāng)進(jìn)行端口操作時(shí),這兩個(gè)參數(shù)被忽略。hEvent:指定一個(gè)I/O操作完成后觸發(fā)的事件(信號(hào))。在調(diào)用讀寫函數(shù)進(jìn)行I/O操作之前,必需設(shè)置該參數(shù)。異步I/O操作可以由GetOverlappedResult()函數(shù)來獲取結(jié)果,也可以使用Windows信號(hào)函數(shù)來處理。GetOverlappedResult()函數(shù)可聲明為:BOOLGetOverlappedResult(HANDLEhFile,LPOVERLAPPPEDlpoverlapped,LPDW0RDlPNumberOfBytesTansferred,燕山大學(xué)工學(xué)學(xué)士學(xué)位論文36BOOLbWait);其中主要參數(shù)介紹如下:hFile:標(biāo)識(shí)通信句柄,它應(yīng)該和開始調(diào)用重疊結(jié)構(gòu)的ReadFile,WriteFile,WaitCommEvent函數(shù)的參數(shù)一致。lpoverlapped:在啟動(dòng)異步操作時(shí)指定的0VERLAPPED結(jié)構(gòu)。lPNumberOfBytesTansferred:指向一個(gè)長(zhǎng)整型變量,該變量接收有一個(gè)讀或?qū)懖僮鲗?shí)際傳遞的字節(jié)數(shù)。bWait:指定函數(shù)是否等待掛起的異步操作完成。如果該參數(shù)設(shè)為1,該函數(shù)知道I/O操作完成后才返回。如果該參數(shù)被設(shè)為0,同時(shí)處于披掛起狀態(tài),該函數(shù)返回為0,且GetLastError()函數(shù)返回ERROR_IO_INCOMPLETE。如果該函數(shù)調(diào)用成功,則返回值不為零,如果函數(shù)調(diào)用失敗,則返回值為零。Windows也使用等待函數(shù)來檢查事件對(duì)象的當(dāng)前狀態(tài)或等待Windows狀態(tài)信號(hào),在WaitForSingleObject()函數(shù)中指定的OVERLAPPED結(jié)構(gòu)中的hEvent即可獲取函數(shù)返回事件。WaitForSingleObject()函數(shù)的的聲明如下:DWORDWaitForSingleObject(HANDLEhHandle,DWORDdwMilliseconds);其中主要參數(shù)如下:hHandle:指定一個(gè)司步時(shí)間的勾柄,這里是指oVERLAPPEd結(jié)構(gòu)中的hEvenl句柄。dwMilliseconds:以ms為單位指定超時(shí)時(shí)間。該函數(shù)如果調(diào)用成功,則返回值標(biāo)識(shí)該函數(shù)導(dǎo)致該函數(shù)返回的事件,否則返回值WAIT_FAILE。成功的返回值可以是以下的三個(gè)值之一:WAIT_ABANDONED

溫馨提示

  • 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. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論