VC++串口編程API詳解.doc_第1頁
VC++串口編程API詳解.doc_第2頁
VC++串口編程API詳解.doc_第3頁
VC++串口編程API詳解.doc_第4頁
VC++串口編程API詳解.doc_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡(jiǎn)介

VC+串口編程主要API詳解該文檔是本人在剛剛接觸到VC+下的串口編程時(shí),總結(jié)歸納的一些主要的API函數(shù),可以幫助初學(xué)者更好的理解串口編程的方法。1. 打開串口HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);參數(shù):lpFileName:將要打開的串口邏輯名,如“COM1”; dwDesiredAccess:指定串口訪問的類型,可以是讀取、寫入或二者并列; dwShareMode:指定共享屬性,由于串口不能共享,該參數(shù)必須置為0; lpSecurityAttributes:引用安全性屬性結(jié)構(gòu),缺省值為NULL; dwCreationDistribution:創(chuàng)建標(biāo)志,對(duì)串口操作該參數(shù)必須置為OPEN_EXISTING; dwFlagsAndAttributes:屬性描述,用于指定該串口是否進(jìn)行異步操作,該值為FILE_FLAG_OVERLAPPED,表示使用異步的I/O;該值為0,表示同步I/O操作,本工程采用異步方式;hTemplateFile:對(duì)串口而言該參數(shù)必須置為NULL;2. 獲取串口設(shè)備控制塊DCBBOOL GetCommState( HANDLE hFile, /標(biāo)識(shí)通訊端口的句柄,由CreateFile()函數(shù)返回的句柄 LPDCB lpDCB /指向一個(gè)設(shè)備控制塊(DCB結(jié)構(gòu))的指針 );3. 設(shè)置串口設(shè)備控制塊DCBBOOL SetCommState( HANDLE hFile, /標(biāo)識(shí)通訊端口的句柄,由CreateFile()函數(shù)返回的句柄 LPDCB lpDCB /指向一個(gè)設(shè)備控制塊(DCB結(jié)構(gòu))的指針 );4. 設(shè)置串口輸入輸出緩沖區(qū)大小BOOL SetupComm( HANDLE hFile,/ 通信設(shè)備的句柄 DWORD dwInQueue,/ 輸入緩沖區(qū)的大小(字節(jié)數(shù)) DWORD dwOutQueue/ 輸出緩沖區(qū)的大?。ㄗ止?jié)數(shù)) );5. 清空讀寫緩沖區(qū)內(nèi)容BOOL PurgeComm( HANDLE hFile,/串口句柄 DWORD dwFlags/ 需要完成的操作 );參數(shù)dwFlags指定要完成的操作,可以是下列值的組合: PURGE_TXABORT 中斷所有寫操作并立即返回,即使寫操作還沒有完成。PURGE_RXABORT 中斷所有讀操作并立即返回,即使讀操作還沒有完成。PURGE_TXCLEAR 清除輸出緩沖區(qū)PURGE_RXCLEAR 清除輸入緩沖區(qū)6. 超時(shí)時(shí)間獲取與設(shè)置BOOL GetCommTimeouts(/獲取串口超時(shí)設(shè)置 HANDLE hFile,/標(biāo)識(shí)通信設(shè)備,CreateFile()函數(shù)返回該句柄; LPCOMMTIMEOUTS lpCommTimeouts/指向COMMTIMEOUTS結(jié)構(gòu)。);BOOL SetCommTimeouts(/設(shè)置串口超時(shí)時(shí)間 HANDLE hFile,/標(biāo)識(shí)通信設(shè)備,CreateFile()函數(shù)返回該句柄; LPCOMMTIMEOUTS lpCommTimeouts/指向COMMTIMEOUTS結(jié)構(gòu)。);COMMTIMEOUTS結(jié)構(gòu)的定義為: typedef struct _COMMTIMEOUTS DWORD ReadIntervalTimeout; /讀間隔超時(shí),單位ms DWORD ReadTotalTimeoutMultiplier; /讀時(shí)間系數(shù),單位ms DWORD ReadTotalTimeoutConstant; /讀時(shí)間常量,單位ms DWORD WriteTotalTimeoutMultiplier; / 寫時(shí)間系數(shù),單位ms DWORD WriteTotalTimeoutConstant; /寫時(shí)間常量,單位ms COMMTIMEOUTS,*LPCOMMTIMEOUTS;參數(shù)詳解:ReadIntervalTimeout:以ms為單位指定通信線路上兩個(gè)字符到達(dá)之間的最大時(shí)間間隔。 在ReadFile()操作期間,從接收到第一個(gè)字符時(shí)開始計(jì)時(shí)。如果任意兩個(gè)字符到達(dá)之間的時(shí)間間隔超過這個(gè)最大值,則ReadFile()操作完成,并返回緩沖數(shù)據(jù)。如果被置為0,則表示不使用間隔超時(shí)。Windows使用下面的式子計(jì)算總超時(shí)時(shí)間:ReadTotalTimeout = ( ReadTotalTimeoutMultiplier*bytes_to_read )+ReadTotalTimeoutConstant;WriteTotalTimeout= ( WriteTotalTimeoutMultiplier*bytes_to_write )+WriteTotalTimeoutConstant;超時(shí)有兩種類型。第一種類型叫區(qū)間超時(shí)(intervaltimeout),它僅適應(yīng)于從端口讀取數(shù)據(jù)它指定在讀取兩個(gè)字符之間要經(jīng)歷多長(zhǎng)時(shí)間。接收一個(gè)字符時(shí),Windows就啟動(dòng)一個(gè)內(nèi)部計(jì)時(shí)器。在下一個(gè)字符到達(dá)之前,如果定時(shí)器超過了區(qū)間超時(shí)設(shè)定時(shí)間,讀函數(shù)就會(huì)放棄。第二種類型的超時(shí)叫做總超時(shí)( total timeout),它適于讀和寫端口。當(dāng)讀或?qū)懱囟ㄗ止?jié)數(shù)需要的總時(shí)間超過某一閾值時(shí),該超時(shí)即被觸發(fā)。當(dāng)超時(shí)的常數(shù)和系數(shù)都設(shè)置為0,則沒有總超時(shí)時(shí)間。如果讀間隔超時(shí)被設(shè)置成MAXDWORD并且讀時(shí)間系數(shù)和讀時(shí)間常量都為0,那么在讀一次輸入緩沖區(qū)的內(nèi)容后讀操作就立即返回而不管是否讀入了要求的字符。在用異步方式讀寫串口時(shí),雖然ReadFile和WriteFile在完成操作以前就可能返回,但超時(shí)仍然是起作用的。在這種情況下,超時(shí)規(guī)定的是操作的完成時(shí)間,而不是ReadFile和WriteFile的返回時(shí)間。7. 關(guān)閉串口BOOL CloseHandle( HANDLE hObject; /串口句柄);8. 讀寫串口BOOL ReadFile( HANDLE hFile,/串口的句柄 LPVOID lpBuffer,/ 讀入的數(shù)據(jù)存儲(chǔ)的地址, DWORD nNumberOfBytesToRead, / 要讀入的數(shù)據(jù)的字節(jié)數(shù) LPDWORD lpNumberOfBytesRead, / 指向一個(gè)DWORD數(shù)值,該數(shù)值返回讀操作實(shí)際讀入的字節(jié)數(shù) LPOVERLAPPED lpOverlapped / 異步操作時(shí),該參數(shù)指向一個(gè)OVERLAPPED結(jié)構(gòu),同步操作時(shí),該參數(shù)為NULL。 );BOOL WriteFile( HANDLE hFile,/串口的句柄 LPCVOID lpBuffer,/ 寫入的數(shù)據(jù)存儲(chǔ)的地址, DWORD nNumberOfBytesToWrite, /要寫入的數(shù)據(jù)的字節(jié)數(shù) LPDWORD lpNumberOfBytesWritten, / 指向指向一個(gè)DWORD數(shù)值,該數(shù)值返回實(shí)際寫入的字節(jié)數(shù) LPOVERLAPPED lpOverlapped / 重疊操作時(shí),該參數(shù)指向一個(gè)OVERLAPPED結(jié)構(gòu), 同步操作時(shí),該參數(shù)為NULL。 );在同步執(zhí)行時(shí),函數(shù)直到操作完成后才返回。這意味著同步執(zhí)行時(shí)線程會(huì)被阻塞,從而導(dǎo)致效率下降。在異步執(zhí)行時(shí),即使操作還未完成,這兩個(gè)函數(shù)也會(huì)立即返回,費(fèi)時(shí)的I/O操作在后臺(tái)進(jìn)行。如果操作成功,這兩個(gè)函數(shù)都返回TRUE。需要注意的是,當(dāng)ReadFile和WriteFile返回FALSE時(shí),不一定就是操作失敗,應(yīng)該調(diào)用GetLastError函數(shù)分析返回的結(jié)果。例如,在異步操作時(shí)如果操作還未完成函數(shù)就返回,那么函數(shù)就返回FALSE,而且GetLastError函數(shù)返回ERROR_IO_PENDING。這說明異步操作還未完成。9. 清除錯(cuò)誤BOOL ClearCommError( HANDLE hFile,/ 串口句柄 LPDWORD lpErrors,/ 指向接收錯(cuò)誤碼的變量 LPCOMSTAT lpStat/ 指向通訊狀態(tài)緩沖區(qū) );該函數(shù)獲得通信錯(cuò)誤并報(bào)告串口的當(dāng)前狀態(tài),同時(shí),該函數(shù)清除串口的錯(cuò)誤標(biāo)志以便繼續(xù)輸入、輸出操作。在使用ReadFile 函數(shù)進(jìn)行讀操作前,應(yīng)先使用ClearCommError函數(shù)清除錯(cuò)誤。參數(shù)lpStat指向一個(gè)COMSTAT結(jié)構(gòu),該結(jié)構(gòu)返回串口狀態(tài)信息。 COMSTAT結(jié)構(gòu) COMSTAT結(jié)構(gòu)包含串口的信息,結(jié)構(gòu)定義如下: typedef struct _COMSTAT / cst DWORD fCtsHold : 1; / Tx waiting for CTS signal DWORD fDsrHold : 1; / Tx waiting for DSR signal DWORD fRlsdHold : 1; / Tx waiting for RLSD signal DWORD fXoffHold : 1; / Tx waiting, XOFF char recd DWORD fXoffSent : 1; / Tx waiting, XOFF char sent DWORD fEof : 1; / EOF character sent DWORD fTxim : 1; / character waiting for Tx DWORD fReserved : 25; / reserved DWORD cbInQue; / bytes in input buffer DWORD cbOutQue; / bytes in output buffer COMSTAT, *LPCOMSTAT;10. 設(shè)置通訊端口監(jiān)聽事件BOOL SetCommMask( HANDLE hFile, /標(biāo)識(shí)通信端口的句柄 DWORD dwEvtMask /能夠使能的通信事件);通訊端口的事件由dwEvtMask變量來設(shè)置,其可取如下值: EV_BREAK 檢測(cè)到輸入為止EV_CTS CTS(清除發(fā)送)信號(hào)改變狀態(tài)EV_DSR DSR(數(shù)據(jù)設(shè)置就緒)信號(hào)改變狀態(tài)EV_ERR 發(fā)生了線路狀態(tài)錯(cuò)誤.線路狀態(tài)錯(cuò)誤為:CE_FRAME(幀錯(cuò)誤)CE_OVERRUN(接收緩沖區(qū)超限)CE_RXPARITY(奇偶校驗(yàn)錯(cuò)誤)EV_RING 檢測(cè)到振鈴EV_RLSD RLSD (接收線路信號(hào)檢測(cè))信號(hào)改變狀態(tài)EV_RXCHAR 接收到一個(gè)字符,并放入輸入緩沖區(qū)EV_RXFLAG 使用SetCommState()函數(shù)設(shè)置的DCB結(jié)構(gòu)中的等待字符已被傳入輸入緩沖區(qū)中。EV_TXEMPTY 輸出緩沖區(qū)中最后一個(gè)字符發(fā)送出去在用SetCommMask指定了有用的事件后,應(yīng)用程序可調(diào)用WaitCommEvent()來等待事件發(fā)生。11. 獲取端口監(jiān)聽事件BOOL GetCommMask( HANDLE hFile, /標(biāo)識(shí)通信端口的句柄 LPDWORD lpEvtMask /存儲(chǔ)監(jiān)控的通信事件);12. 等待監(jiān)聽事件發(fā)生BOOL WaitCommEvent(HANDLE hFile, /標(biāo)識(shí)通信端口的句柄LPDWORD lpEvtMask, /指向存放事件標(biāo)識(shí)變量的指針LPOVERLAPPED lpOverlapped / 指向overlapped結(jié)構(gòu));該函數(shù)調(diào)用成功返回TURE,若失敗則返回FALSE。若

溫馨提示

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

評(píng)論

0/150

提交評(píng)論