串口通信常用API_第1頁
串口通信常用API_第2頁
串口通信常用API_第3頁
串口通信常用API_第4頁
串口通信常用API_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、串口通信常用API1-CreateFile()用途:打開串口原型:HANDLE CreateFile(LPCTSTR IpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTR舊UTES lpSecurityAttributes,DWORD dwCreationDistribution,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile);參數(shù)說明:-lpFileName:要打開的文件名稱。對(duì)串口通信來說就是COM1或COM2。-dwDesiredAccess:讀寫模式設(shè)置。此

2、處應(yīng)該用 GENERIC_READ 及 GENERIC_WRITE。-dwShareMode:串口共享模式。此處不允許其他應(yīng)用程序共享,應(yīng)為0。-lpSecurityAttributes:串口的安全屬性,應(yīng)為0,表示該串口不可被子程序繼承。-dwCreationDistribution:創(chuàng)建文件的性質(zhì),此處為 OPEN_EXISTING.-dwFlagsAndAttributes:屬性及相關(guān)標(biāo)志,這里使用異步方式應(yīng)該用 FILE_FLAG_OVERLAPPED。-hTemplateFile:此處為 0。操作說明:若文件打開成功,串口即可使用了,該函數(shù)返回串口的句柄,以后對(duì)串口操作時(shí) 即可使用該

3、句柄。舉例:HANDLE hComm;hComm=CreateFile(COM1, 串口號(hào)GENERIC_READ|GENERIC_WRITE, 允許讀寫0, /通訊設(shè)備必須以獨(dú)占方式打開NULL, /無安全屬性O(shè)PEN_EXISTING, /通訊設(shè)備已存在FILE_FLAG_OVERLAPPED, /異步 I/O0); 通訊設(shè)備不能用模板打開hComm即為函數(shù)返回的串口 1的句柄。2-CloseHandle()用途:關(guān)閉串口原型:BOOL CloseHandle(HANDLE hObjedt)參數(shù)說明:-hObjedt:串口句柄操作說明:成功關(guān)閉串口時(shí)返回true,否則返回false舉例:C

4、loseHandle(hComm);3-GetCommState()用途:取得串口當(dāng)前狀態(tài)原型:BOOL GetCommState(HANDLE hFile,LPDCB IpDCB);參數(shù)說明:-hFile:串口句柄-lpDCB:設(shè)備控制塊(Device Control Block)結(jié)構(gòu)地址。此結(jié)構(gòu)中含有和設(shè)備相關(guān)的參數(shù)。此處是與串口相關(guān)的參數(shù)。由于參數(shù)非常多,當(dāng)需要設(shè)置串口參數(shù)時(shí),通常是先取得串口的參數(shù)結(jié)構(gòu),修改部分參數(shù)后再將參數(shù)結(jié)構(gòu)寫入。在此僅介紹少數(shù)的幾個(gè)常用的參數(shù):DWORD BaudRate:串口波特率DWORD fParity:為1的話激活奇偶校驗(yàn)檢查DWORD Parity:校驗(yàn)

5、方式,值04分別對(duì)應(yīng)無校驗(yàn)、奇校驗(yàn)、偶校驗(yàn)、校驗(yàn)置位、校驗(yàn)清零DWORD ByteSize: 一個(gè)字節(jié)的數(shù)據(jù)位個(gè)數(shù),范圍是58DWORD StopBits:停止位個(gè)數(shù),02分別對(duì)應(yīng)1位、1.5位、2位停止位操作舉例:DCB ComDCB; 串口設(shè)備控制塊GetCommState(hComm,&ComDCB);4-SetCommState()用途:設(shè)置串口狀態(tài),包括常用的更改串口號(hào)、波特率、奇偶校驗(yàn)方式、數(shù)據(jù)位數(shù)等原型:BOOL SetCommState(HANDLE hFile,LPDCB IpDCB);參數(shù)說明:-hFile:串口句柄-lpDCB:設(shè)備控制塊(Device Control B

6、lock)結(jié)構(gòu)地址。要更改的串口參數(shù)包含在此結(jié)構(gòu)中。操作舉例:DCB ComDCB;GetCommState(hComm,&ComDCB);/取得當(dāng)前串口狀態(tài)ComDCB.BaudRate=9600;/更改為9600bps,該值即為你要修改后的波特率SetCommState(hComm,&ComDCB;/將更改后的參數(shù)寫入串口5-WriteFile()用途:向串口寫數(shù)據(jù)原型:BOOL WriteFile(HANDLE hFile,LPCVOID IpBuffer,DWORD nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWritten,LPOVERL

7、APPED lpOverlapped);參數(shù)說明:-hFile:串口句柄-lpBuffer:待寫入數(shù)據(jù)的首地址-nNumberOfBytesToWrite:待寫入數(shù)據(jù)的字節(jié)數(shù)長度-lpNumberOfBytesWritten:函數(shù)返回的實(shí)際寫入串口的數(shù)據(jù)個(gè)數(shù)的地址,利用此變量可判 斷實(shí)際寫入的字節(jié)數(shù)和準(zhǔn)備寫入的字節(jié)數(shù)是否相同。-lpOverlapped:重疊I/O結(jié)構(gòu)的指針操作舉例:DWORD BytesSent=0;unsigned char SendBytes5=1,2,3,4,5;OVERLAPPED ov_Write;ov_Write.Offset=0;ov_Write.OffsetH

8、igh=0;WriteFile(hComm, /調(diào)用成功返回非零,失敗返回零SendBytes, 輸出緩沖區(qū)5, /準(zhǔn)備發(fā)送的字符長度&BytesSent, 實(shí)際發(fā)出的字符數(shù)&ov_Write); 重疊結(jié)構(gòu)如果函數(shù)執(zhí)行成功的話檢查BytesSent的值應(yīng)該為5,此函數(shù)是WriteFile函數(shù)執(zhí)行完畢后自行填充的,利用此變量的填充值可以用來檢查該函數(shù)是否將所有的數(shù)據(jù)成功寫入串口6-ReadFile()用途:讀串口數(shù)據(jù)原型:BOOL ReadFile(HANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,lpNumberOfBytesRea

9、d,lpOverlapped);參數(shù)說明:-hFile:串口句柄-lpBuffer:存儲(chǔ)被讀出數(shù)據(jù)的首地址-nNumberOfBytesToRead:準(zhǔn)備讀出的字節(jié)個(gè)數(shù)-NumberOfBytesRead:實(shí)際讀出的字節(jié)個(gè)數(shù)-IpOverlapped:異步 I/O 結(jié)構(gòu),操作舉例:unsigned char ucRxBuff20;COMSTAT ComStat;DWORD dwError=0;DWORD BytesRead=0;OVERLAPPED ov_Read;ov_Read.hEvent=CreateEvent(NULL, true, false, NULL);/必須創(chuàng)建有效事件Clea

10、rCommError(hComm,&dwError,&ComStat);/檢查串口接收緩沖區(qū)中的數(shù)據(jù)個(gè)數(shù)bResult=ReadFile(hComm, /串口句柄ucRxBuff, /輸入緩沖區(qū)地址ComStat.cbInQue, /想讀入的字符數(shù)&BytesRead, 實(shí)際讀出的字節(jié)數(shù)的變量指針&ov_Read); /重疊結(jié)構(gòu)指針假如當(dāng)前串口中有5個(gè)字節(jié)數(shù)據(jù)的話,那么執(zhí)行完ClearCommError()函數(shù)后,ComStat結(jié)構(gòu)中的ComStat.cbInQue將被填充為5,此值在ReadFile函數(shù)中可被直接利用。7-ClearCommError()用途:清除串口錯(cuò)誤或者讀取串口現(xiàn)在的狀

11、態(tài) 原型:BOOL ClearCommError(HANDLE hFile,LPDWORD IpErrors,LPCOMATAT lpStat);參數(shù)說明:-hFile:串口句柄-lpErrors:返回錯(cuò)誤數(shù)值,錯(cuò)誤常數(shù)如下:1-CE_BREAK:檢測(cè)到中斷信號(hào)。意思是說檢測(cè)到某個(gè)字節(jié)數(shù)據(jù)缺少合法的停止位。2-CE_FRAME:硬件檢測(cè)到幀錯(cuò)誤。3-CE_IOE:通信設(shè)備發(fā)生輸入/輸出錯(cuò)誤。4-CE_MODE:設(shè)置模式錯(cuò)誤,或是hFile值錯(cuò)誤。5-CE_OVERRUN:溢出錯(cuò)誤,緩沖區(qū)容量不足,數(shù)據(jù)將丟失。6-CE_RXOVER:溢出錯(cuò)誤。7-CE_RXPARITY:硬件檢查到校驗(yàn)位錯(cuò)誤。8

12、-CE_TXFULL:發(fā)送緩沖區(qū)已滿。-lpStat:指向通信端口狀態(tài)的結(jié)構(gòu)變量,原型如下:typedef struct _COMSTATDWORD cbInQue; 輸入緩沖區(qū)中的字節(jié)數(shù)DWORD cbOutQue;輸出緩沖區(qū)中的字節(jié)數(shù)COMSTAT,*LPCOMSTAT;該結(jié)構(gòu)中對(duì)我們很重要的只有上面兩個(gè)參數(shù),其他的我們可以不用管。操作舉例:COMSTAT ComStat;DWORD dwError=0;ClearCommError(hComm,&dwError,&ComStat);上式執(zhí)行完后,ComStat.cbInQue就是串口中當(dāng)前含有的數(shù)據(jù)字節(jié)個(gè)數(shù),我們利用此 數(shù)值就可以用Rea

13、dFile()函數(shù)去讀串口中的數(shù)據(jù)了。8-PurgeComm()用途:清除串口緩沖區(qū)原型:BOOL PurgeComm(HANDLE hFile,DWORD dwFlags);參數(shù)說明:-hFile:串口句柄 -dwFlags:指定串口執(zhí)行的動(dòng)作,由以下參數(shù)組成:-PURGE_TXABORT:停止目前所有的傳輸工作立即返回不管是否完成傳輸動(dòng)作。-PURGE_RXABORT:停止目前所有的讀取工作立即返回不管是否完成讀取動(dòng)作。-PURGE_TXCLEAR:清除發(fā)送緩沖區(qū)的所有數(shù)據(jù)。-PURGE_RXCLEAR:清除接收緩沖區(qū)的所有數(shù)據(jù)。操作舉例:PurgeComm(hComm,PURGE_RXC

14、LEAR|PURGE_TXCLEAR|PURGE_RXABORT|PURGE_TXABORT);清除串口的所有操作。9-SetCommMask()用途:設(shè)置串口通信事件。原型:BOOL SetCommMask(HANDLE hFile,DWORD dwEvtMask);參數(shù)說明:-hFile:串口句柄 -dwEvtMask:準(zhǔn)備監(jiān)視的串口事件掩碼注:在用api函數(shù)撰寫串口通信函數(shù)時(shí)大體上有兩種方法,一種是查尋法,另外一種是事件通知法。這兩種方法的區(qū)別在于收串口數(shù)據(jù)時(shí),前一種方法是主動(dòng)的周期性的查詢串口中當(dāng)前有沒有數(shù)據(jù);后一種方法是事先設(shè)置好需要監(jiān)視的串口通信事件,然后依靠單獨(dú)開設(shè)的輔助線程進(jìn)

15、行監(jiān)視該事件是否已發(fā)生,如果沒有發(fā)生的話該線程就一直不停的等待直到該事件發(fā)生后,將該串口事件以消息的方式通知主窗體,然后主窗體收到該消息后依據(jù)不同的事件性質(zhì)進(jìn)行處 理。比如說當(dāng)主窗體收到監(jiān)視線程發(fā)來的RX_CHAR(串口中有數(shù)據(jù))的消息后,就可以用ReadFile()函數(shù)去讀串口。該參數(shù)有如下信息掩碼位值:EV_BREAK:收至U BREAK 信號(hào)EV_CTS:CTS(clear to send)線路發(fā)生變化EV_DSR:DST(Data Set Ready)線路發(fā)生變化EV_ERR:線路狀態(tài)錯(cuò)誤,包括了 CE_FRAME/CE_OVERRUN/CE_RXPARITY 3 鐘錯(cuò)誤。EV_RIN

16、G:檢測(cè)到振鈴信號(hào)。EV_RLSD:CD(Carrier Detect)線路信號(hào)發(fā)生變化。EV_RXCHAR:輸入緩沖區(qū)中已收至U數(shù)據(jù)。EV_RXFLAG:使用 SetCommState()函數(shù)設(shè)置的DCB結(jié)構(gòu)中的等待字符已被傳入輸入緩沖 區(qū)中。EV_TXEMPTY:輸出緩沖區(qū)中的數(shù)據(jù)已被完全送出。操作舉例:SetCommMask(hComm,EV_RXCHAR|EV_TXEMPTY);上面函數(shù)執(zhí)行完畢后將監(jiān)視串口中有無數(shù)據(jù)和發(fā)送緩沖區(qū)中的數(shù)據(jù)是否全部發(fā)送完畢。10-WaitCommEvent()用途:用來判斷用SetCommMask()函數(shù)設(shè)置的串口通信事件是否已發(fā)生。原型:BOOL Wai

17、tCommEvent(HANDLE hFile,LPDWORD lpEvtMask,LPOVERLAPPED lpOverlapped);參數(shù)說明:-hFile:串口句柄-lpEvtMask:函數(shù)執(zhí)行完后如果檢測(cè)到串口通信事件的話就將其寫入該參數(shù)中。-lpOverlapped:異步結(jié)構(gòu),用來保存異步操作結(jié)果。操作舉例:OVERLAPPED os;DWORD dwMask,dwTrans,dwError=0,err;memset(&os,0,sizeof(OVERLAPPED);os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);if(!WaitCommEve

18、nt(hComm,&dwMask,&os)如果異步操作不能立即完成的話,函數(shù)返回FALSE,并且調(diào)用GetLastError()函數(shù)分析錯(cuò)誤原因后返回ERROR_IO_PENDING,指示異步操作正在后臺(tái)進(jìn)行.這種情況下,在函數(shù)返回之前系統(tǒng)設(shè)置OVERLAPPED結(jié)構(gòu)中的事件為無信號(hào)狀態(tài),該函數(shù)等待用SetCommMask()函數(shù)設(shè)置的串口事件發(fā)生,共有9種事件可被監(jiān)視:/EV_BREAK,EV_CTS,EV_DSR,EV_ERR,EV_RING,EV_RLSD,EV_RXCHAR,/EV_RXFLAG,EV_TXEMPTY;當(dāng)其中一個(gè)事件發(fā)生或錯(cuò)誤發(fā)生時(shí),函數(shù)將/OVERLAPPED結(jié)構(gòu)中的事件置為有信號(hào)狀態(tài),并將事件掩碼填充到dwMask參數(shù)中 if(GetLastError()=ERROR_IO_PENDING)/*/*在此等待異步

溫馨提示

  • 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)論