版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、作。常用函數(shù)及作用下:函數(shù)名CreateFileGetCommStateSetCommStateBuilderCommDCBGetCommTimeoutsSetCommTimeoutsSetCommMaskWaitCommEventWaitForMultipleObjectsWriteFileReadFileGetOverlappedResultPurgeCommClearCommErrorCloseHandle第一節(jié)實(shí)現(xiàn)串口通訊的函數(shù)及串口編程簡介API函數(shù)不僅提供了打開和讀寫通訊端口的操作方法,還提供了名目繁多的函數(shù)以支持對串行通訊的各種操作用打開串口檢測串口設(shè)置設(shè)置串口用字符串中的值來填
2、充設(shè)備控制塊檢測通信超時(shí)設(shè)置設(shè)置通信超時(shí)參數(shù)設(shè)定被監(jiān)控事件等待被監(jiān)控事件發(fā)生等待多個(gè)被監(jiān)測對象的結(jié)果發(fā)送數(shù)據(jù)接收數(shù)據(jù)返回最后重疊(異步)操作結(jié)果清空串口緩沖區(qū),退出所有相關(guān)操作更新串口狀態(tài)結(jié)構(gòu)體,并清除所有串口硬件錯(cuò)誤關(guān)閉串行口用Windows API編寫串口程序本身是有巨大優(yōu)點(diǎn)的,因?yàn)榭刂颇芰鼜?qiáng),效率也會更 高。API編寫串口,過程一般是這樣的:1、 創(chuàng)建串口句柄,用 CreateFile ;2、對串口的參數(shù)進(jìn)行設(shè)置,其中比較重要的是波特率( BaudRate),數(shù)據(jù)寬度(BytesBits ),奇偶 校驗(yàn)(Parity ),停止位(StopBits ),當(dāng)然,重要的還有端口號( Por
3、t );3、 然后對串口進(jìn)行相應(yīng)的讀寫操作,這時(shí)候用到ReadFile和WriteFile 函數(shù);4、 讀寫結(jié)束后,要關(guān)閉串口句柄,用 CloseFile 。下面依次講述各個(gè)步驟的過程。第二節(jié)創(chuàng)建串口句柄打開串口從字面上去理解,大家也可以發(fā)現(xiàn)CreateFile 實(shí)際上表明 Windows是把串口當(dāng)作一個(gè)文件來處理的,所以它也有文件那樣的緩沖區(qū)、句柄、讀寫錯(cuò)誤等,不同的是,這個(gè)文件名字只有固定的幾個(gè)(一般為四個(gè)),而且始終存在(EXSITING),而且在調(diào)用 CreateFile的時(shí)候請注意它的參數(shù)。CreateFile 函數(shù)原型如下:HANDLE CreateFile(LPCTSTR IpF
4、ileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES IpSecurityAttributes,DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile );lpFileName :指向一個(gè)以 NULL結(jié)束的字符串,該串指定了要?jiǎng)?chuàng)建、打開或截?cái)嗟奈募?、管道、通信源、磁盤設(shè)備或控制臺的名字。當(dāng)用CreateFile 打開串口時(shí),這個(gè)參數(shù)可用“ COM1指定串口1,用“COM2指定串口 2,依此類推。dwDesire
5、Access :指定對文件訪問的類型,該參數(shù)可以為GENERIC_READg定對該文件的讀訪問權(quán))或GENERIC_WRITE指定該文件的寫訪問權(quán))兩個(gè)值之一或同時(shí)為為這兩個(gè)值。用ENERIC_READ|GENERIC_WRITE則指定可對串口進(jìn)行讀寫;dwShareMode:指定此文件可以怎樣被共享。因?yàn)榇锌诓恢С秩魏喂蚕砟J剑詃wShareMode必須設(shè)為lpSecurityAttributes定義安全屬性,一般不用,可設(shè)為 NULL Win 9x下該參數(shù)被忽略;dwCreationDistribution定義文件創(chuàng)建方式,對串口必須設(shè)為 OPEN_EXISTING表示打開已經(jīng)存在的
6、文件;dwFlagsAndAttributes 為該文件指定定義文件屬性和標(biāo)志,這個(gè)程序中設(shè)為FILE_FLAG_OVERLAPPE昧示異步通信方式;hTemplateFile指向一個(gè)模板文件的句柄,串口無模板可言,設(shè)為 NULL在 Windows 9x下該參數(shù)必須為 NULL串口被成功打開時(shí),返回其句柄,否則返回INVALID_HANDLE_value(0XFFFFFFFF)。上面說到了異步,那什么是異步呢?異步是相對同步這個(gè)概念而言的。異步,就是說,在進(jìn)行串口讀寫操作時(shí),不用等到 I/O操作完成后函數(shù)才返回,也就是說,異步可以更快得 響應(yīng)用戶操作;同步,相反,響應(yīng)的 I/O操作必須完成后函
7、數(shù)才返回,否則阻塞線程。對于一些很簡單的通訊程序來說,可以選擇同步,這樣可以省去很多錯(cuò)誤檢查,但是對于復(fù)雜一點(diǎn)的應(yīng)用程序, 異步是最佳選擇。實(shí)例1:/*example1.cpp */* lishaoan 2009-06-29 */ /* */ #include <windows.h>#include <stdio.h>打開串口#include <stdlib.h> bool openport(char *portname)/HANDLE hComm;hComm = CreateFile(portname, / 串口號GENERIC_READ | GENERI
8、C_WRITE, / 允許讀寫0, / 通訊設(shè)備必須以獨(dú)占方式打開0, / 無安全屬性O(shè)PEN_EXISTING, /通訊設(shè)備已存在FILE_FLAG_OVERLAPPED,/異步 I/O0); /通訊設(shè)備不能用模板打開if (hComm = INVALID_HANDLE_VALUE)CloseHandle(hComm);return FALSE;elsereturn true; void main()bool open;open=openport("com2");if(open)printf("open comport success");system
9、("pause");/* program end*/實(shí)例2:I*example2.cpp*/* lishaoan 2009-06-29 */ /* * #include <windows.h>#include<stdio.h>#include<stdlib.h>bool openport(char *portname)/HANDLE hComm;打開串口hComm = CreateFile(portname, / 串口號GENERIC_READ | GENERIC_WRITE, / 允許讀寫0, / 通訊設(shè)備必須以獨(dú)占方式打開0, / 無
10、安全屬性O(shè)PEN_EXISTING, /通訊設(shè)備已存在0,/ 同步 I/O0); /通訊設(shè)備不能用模板打開if (hComm = INVALID_HANDLE_VALUE)CloseHandle(hComm);return FALSE;elsereturn true; void main() bool open;open=openport("com2");if(open)printf("open comport success");system("pause");/* program end*/第三節(jié)設(shè)置串口在打開通信設(shè)備句柄后,常常
11、需要對串行口進(jìn)行一些初始化工作。這需要通過一個(gè)DC隹吉構(gòu)來進(jìn)行。DCB結(jié)構(gòu)包含了諸如波特率、每個(gè)字符的數(shù)據(jù)位數(shù)、奇偶校驗(yàn)和停止位數(shù)等信息。在查詢或配置串口的屬性時(shí),都要用DC隹吉構(gòu)來作為緩沖區(qū)。第一次打開串口時(shí),串口設(shè)置為系統(tǒng)默認(rèn)值,函數(shù) GetCommState和SetCommState可用于檢索和設(shè)定端口設(shè)置的DCB假備控制塊)結(jié)構(gòu),該結(jié)構(gòu)中BaudRate、ByteSize、StopBits和Parity 字段含有串口波特率、數(shù) 據(jù)位數(shù)、停止位和奇偶校驗(yàn)控制等信息。程序中用DCB進(jìn)行串口設(shè)置時(shí),應(yīng)先調(diào)用 API函數(shù)GetCommState,來獲得串口的設(shè)置信息:GetCommState(
12、)用途:取得串口當(dāng)前狀態(tài) 原型:BOOL GetCommState(HANDLE hFile, LPDCB lpDCB);參數(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è)置的地方對dcb進(jìn)行設(shè)置。串口有很多的屬性,上面也已經(jīng)介紹了一些最重要的參數(shù)。這里介紹數(shù)據(jù)結(jié)構(gòu)DCBtypedef struct _DCB / dcbDWORD DCBlength;/DCB 結(jié)構(gòu)
13、體大小DWORD BaudRate;/ 波特率DWORD fBinary: 1;/是否是二進(jìn)制,一般設(shè)置為 TRUEDWORD fParity: 1;/是否進(jìn)行奇偶校驗(yàn)DWORD fOutxCtsFlow:1; /CTS線上的硬件握手DWORD fOutxDsrFlow:1; /DSR線上的硬件握手DWORD fDtrControl:2; /DTR 控制DWORD fDsrSensitivity:1;DWORD fTXContinueOnXoff:1;DWORD fOutX: 1;DWORD fInX: 1;/是否使用XON/XOF勒議/是否使用XON/XOFFB議DWORD fErrorCh
14、ar: 1;/發(fā)送錯(cuò)誤協(xié)議DWORD fNull: 1;DWORD fRtsControl:2;DWORD fAbortOnError:1;DWORD fDummy2:17;WORD wReserved;WORD XonLim; /設(shè)置在XO”符發(fā)送之前inbuf中允許的最少字節(jié)數(shù)WORD XoffLim; /在發(fā)送XOFF字符之前outbuf中允許的最多字節(jié)數(shù)BYTE ByteSize; / 數(shù)據(jù)寬度,一般為 8,有時(shí)候?yàn)?BYTE Parity; / 奇偶校驗(yàn)BYTE StopBits; / 停止位數(shù)char XonChar; /設(shè)置表示XON?符的字符,一般是采用0x11這個(gè)數(shù)值char
15、 XoffChar; /設(shè)置表示XOFF字符的字符,一般是采用0x13這個(gè)數(shù)值char ErrorChar;char EofChar;char EvtChar;WORD wReserved1; DCB;我們真正在串口編程中用到的數(shù)據(jù)成員沒有幾個(gè),在此僅介紹少數(shù)的幾個(gè)常用的參數(shù):DWORD BaudRate 串口波特率DWORD fParity :為1的話激活奇偶校驗(yàn)檢查DWORD Parity :校驗(yàn)方式,值 04分別對應(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分別對應(yīng)1位、1.
16、5位、2位停止位然后再末尾調(diào)用 SetCommState就可以了,還是比較方便的。這樣可不必構(gòu)造一個(gè)完整的DC隹吉構(gòu)SetCommState()用途:設(shè)置串口狀態(tài),包括常用的更改串口號、波特率、奇偶校驗(yàn)方式、數(shù)據(jù)位數(shù)等原型:BOOL SetCommState(HANDLE hFile, LPDCB lpDCB);參數(shù)說明:-hFile: 串口句柄-lpDCB:設(shè)備控制塊(Device Control Block)結(jié)構(gòu)地址。要更改的串口參數(shù)包含在此結(jié)構(gòu)中。然后調(diào)用SetCommMask用來指定程序接收特定的串口事件,調(diào)用SetupComm函數(shù),設(shè)置串口緩沖區(qū)大小:SetCommMask()說明:
17、用途:設(shè)置串口通信事件。原型:BOOL SetCommMask(HANDLE hFile,DWORD dwEvtMask);參數(shù)說明:-hFile :串口句柄-dwEvtMask :準(zhǔn)備監(jiān)視的串口事件掩碼該參數(shù)有如下信息掩碼位值:EV_BREAK收到 BREAK言號EV_CTS:CTS(clear to send)線路發(fā)生變化EV_DSR:DST(Data Set Ready)線路發(fā)生變化EV ERR線路狀態(tài)錯(cuò)誤,包括了 CE FRAMECE OVERRUNCE RXPARITY3昔誤。EV_RING:檢測到振鈴信號。EV_RLSD:CD(Carrier Detect)線路信號發(fā)生變化。EV_
18、RXCHARt入緩沖區(qū)中已收至ij數(shù)據(jù)。EV_RXFLAG#用SetCommState()函數(shù)設(shè)置的 DCB吉構(gòu)中的等待字符已被傳入輸入緩沖區(qū)中。EV_TXEMPT輸出緩沖區(qū)中的數(shù)據(jù)已被完全送出。還有,串口因?yàn)槭荌/O操作,可能會產(chǎn)生錯(cuò)誤,這時(shí)候需要用 SetCommTimeouts ()設(shè)置超時(shí)限制,以避免阻塞現(xiàn)象。設(shè)置超時(shí)設(shè)置需要一個(gè)結(jié)構(gòu)體COMMTIMEOUTSSetCommTimeouts ()BOOL SetCommTimeouts( hCommDev, lpctmo );Lpctmo指向包含新的超時(shí)參數(shù)的COMMTIMEOUTS構(gòu)。COMMTIMEOUTS勾定義如下: typede
19、f struct _ COMMTIMEOUTSDWORD ReadIntervalTimeout;DWORD ReadTotalTimeoutMultiplier;DWORD ReadTotalTimeoutconstant;DWORD WriteTotalTimeoutMultiplier;DWORD WriteTotalTimeoutconstant;COMMTIMEOUT S LPCOMMTIMEOUTS;ReadIntervalTimeout :以毫秒為單位指定通信線上兩個(gè)字符到達(dá)之間的最大時(shí)間。在ReadFile操作其間,收到第一個(gè)字符時(shí)開始計(jì)算時(shí)間。若任意兩個(gè)字符到達(dá)之間的間隔超過
20、這個(gè)最大值,ReadFile操作完成,返回緩沖數(shù)據(jù)。0值表示不用間隔限時(shí)。若該成員為MAXDWORD! ReadTotalTimeoutconstant和 ReadTotalTimeoutMultiplier成員為零,則指出讀操作要立即返回已接收到的字符,即使未收到字符,讀操作也要返回。ReadTotalTimeoutMultiplier :以毫秒為單位指定一個(gè)乘數(shù),該乘數(shù)用來計(jì)算讀操作的總限時(shí)時(shí)間。每個(gè)讀 操作的總限時(shí)時(shí)間等于讀操作所需的字節(jié)數(shù)與該值的乘積。ReadTotalTimeoutConstant :以毫秒為單位指定一個(gè)常數(shù),用于計(jì)算讀操作的總限時(shí)時(shí)間。每個(gè)操作的總限時(shí)時(shí)間等于Rea
21、dTotalTimeoutMultiplier成員乘以讀操作所需字節(jié)數(shù)再加上該值的和ReadTotalTimeoutMultiplier WriteTotalTimeoutMultiplier ReadTotalTimeoutMultiplier 舉例:COMMTIMEOUTS timeouts;和 ReadTotalTimeoutConstant和 WriteTotalTimeoutconstant和 ReadTotalTimeoutConstant成員的值為0表示讀操作不使用限時(shí)時(shí)間。的意義和作用分別與相似,不再重復(fù)。timeouts.ReadIntervalTimeout=MAXDWOR
22、D;timeouts.ReadTotalTimeoutConstant=0;timeouts.ReadTotalTimeoutMultiplier=0;timeouts.WriteTotalTimeoutConstant=50;timeouts.WriteTotalTimeoutMultiplier=2000;SetCommTimeouts(m_hCom, &timeouts);這里將 ReadIntervalTimeout設(shè)置為最大字節(jié)數(shù),.ReadTotalTimeoutConstant 和ReadTotalTimeoutMultiplier都設(shè)置為0,表示不設(shè)置讀操作超時(shí),也就是
23、說讀操作瞬間完成,不進(jìn)行等待。調(diào)用PurgeCommg數(shù)可以終止正在進(jìn)行的讀寫操作,該函數(shù)還會清除輸入或輸出緩沖區(qū)中的內(nèi)容。PurgeComm()說明:功能:終止目前正在進(jìn)行的讀或?qū)懙膭?dòng)作函數(shù)原型:BOOL PurgeComm(HANDLE hFile, / handle of communications resourceDWORD dwFlags / action to perform);參數(shù)說明:HANDLE hFile,/ 串口名稱字符串dwFlags 共有四種 flags:PURGE_TXABO頸止目前正在進(jìn)行的(背景)寫入動(dòng)作PURGE_RXABORT正目前正在進(jìn)行的(背景)讀取動(dòng)
24、作PURGE_TXCLEAR: flush 寫入的 bufferPURGE_TXCLEAR: flush 讀取的 buffer實(shí)例3:/*example3.cpp*/* lishaoan 2009-06-29 */ /* */ #include <windows.h>#include<stdio.h>#include<stdlib.h>打開串口bool openport(char *portname)/HANDLE hComm;串口號hComm = CreateFile(portname, /GENERIC_READ | GENERIC_WRITE, / 允
25、許讀寫0, /通訊設(shè)備必須以獨(dú)占方式打開0, /無安全屬性O(shè)PEN_EXISTING, /通訊設(shè)備已存在0,/ 同步 I/O0); /通訊設(shè)備不能用模板打開if (hComm = INVALID_HANDLE_VALUE)CloseHandle(hComm);return FALSE;elsereturn true;bool setupdcb(int rate_arg)/設(shè)置 DCBDCB dcb;int rate= rate_arg;memset(&dcb,0,sizeof(dcb);if(!GetCommState(hComm,&dcb)/獲取當(dāng)前 DCB配置return
26、FALSE;/ set DCB to configure the serial port dcb.DCBlength= sizeof(dcb);/*Serial Port Config*/dcb.BaudRatedcb.Paritydcb.fParity dcb.StopBits dcb.ByteSize dcb.fOutxCtsFlow dcb.fOutxDsrFlow dcb.fDtrControldcb.fDsrSensitivity = 0;dcb.fRtsControldcb.fOutXdcb.fInX/*misc parameters */dcb.fErrorChardcb.fBi
27、nary=rate;=NOPARITY;=0;=ONESTOPBIT;=8;=0;=0;=DTR_CONTROL_DISABLE;=RTS_CONTROL_DISABLE;=0;=0;=0;=1;=0;dcb.fNull dcb.fAbortOnError = 0;dcb.wReserved= 0;dcb.XonLim= 2;dcb.XoffLim= 4;dcb.XonChar= 0x13;dcb.XoffChar= 0x19;dcb.EvtChar= 0;/ set DCBif(!SetCommState(hComm,&dcb)return false;elsereturn true
28、;bool setuptimeout(DWORD ReadInterval,DWORD ReadTotalMultiplier,DWORD ReadTotalconstant,DWORDWriteTotalMultiplier,DWORD WriteTotalconstant)COMMTIMEOUTS timeouts;timeouts.ReadIntervalTimeout=ReadInterval;timeouts.ReadTotalTimeoutConstant=ReadTotalconstant;timeouts.ReadTotalTimeoutMultiplier=ReadTotal
29、Multiplier;timeouts.WriteTotalTimeoutConstant=WriteTotalconstant;timeouts.WriteTotalTimeoutMultiplier=WriteTotalMultiplier;if(!SetCommTimeouts(hComm, &timeouts)return false;elsereturn true;void main()bool open;open=openport("com2");if(open)printf("open comport success");if(se
30、tupdcb(9600)printf("setupDCB success'n");if(setuptimeout(0,0,0,0,0)printf("setuptimeout successn");SetCommMask(hComm, EV_RXCHAR);/當(dāng)有字符在inbuf中時(shí)產(chǎn)生這個(gè)事件清除串口的所有操作PurgeComm(hComm,PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_RXABORT|PURGE_TXABORT);system("pause"); /* program end*/第四節(jié)
31、 讀寫串口數(shù)據(jù)及關(guān)閉串口Win32API函數(shù)ReadFile和 WriteFile 支持對串行口的讀寫操作。在調(diào)用 ReadFile和WriteFile 之前,線程應(yīng)該調(diào)用ClearCommError函數(shù)清除錯(cuò)誤標(biāo)志。該函數(shù)負(fù)責(zé)報(bào)告指定的錯(cuò)誤和設(shè)備的當(dāng)前狀態(tài)。ClearCommError()用途:清除串口錯(cuò)誤或者讀取串口現(xiàn)在的狀態(tài)原型:BOOL ClearCommError(HANDLE hFile,LPDWORD lpErrors,LPCOMATAT lpStat);參數(shù)說明:-hFile: 串口句柄-lpErrors :返回錯(cuò)誤數(shù)值,錯(cuò)誤常數(shù)如下:1-CE_BREAK:檢測到中斷信號。意思
32、是說檢測到某個(gè)字節(jié)數(shù)據(jù)缺少合法的停止位。2-CE_FRAME硬件檢測到幀錯(cuò)誤。3-CE_IOE:通信設(shè)備發(fā)生輸入/輸出錯(cuò)誤。4-CE_MODE設(shè)置模式錯(cuò)誤,或是 hFile值錯(cuò)誤。5-CE_OVERRUN出錯(cuò)誤,緩沖區(qū)容量不足,數(shù)據(jù)將丟失。6-CE_RXOVE畸出錯(cuò)誤。7-CE_RXPARITY:硬件檢查到校驗(yàn)位錯(cuò)誤。8-CE_TXFULL:發(fā)送緩沖區(qū)已滿。-lpStat:指向通信端口狀態(tài)的結(jié)構(gòu)變量,原型如下:typedef struct _COMSTATDWORD cbInQue;/輸入緩沖區(qū)中的字節(jié)數(shù)DWORD cbOutQue;/輸出緩沖區(qū)中的字節(jié)數(shù)COMSTAT,*LPCOMSTAT;
33、該結(jié)構(gòu)中對我們很重要的只有上面兩個(gè)參數(shù),其他的我們可以不用管。假如當(dāng)前串口中有5個(gè)字節(jié)數(shù)據(jù)的話,那么執(zhí)行完 ClearCommError()函數(shù)后,ComStat結(jié)構(gòu)中的ComStat.cbInQue將被填充為5,此值在ReadFile函數(shù)中可被直接利用。例如:COMSTAT ComStat;DWORD dwError=0;ClearCommError(hComm,&dwError,&ComStat);上式執(zhí)行完后,ComStat.cbInQue就是串口中當(dāng)前含有的數(shù)據(jù)字節(jié)個(gè)數(shù),我們利用此數(shù)值就可以用 ReadFile()函數(shù)去讀串口中的數(shù)據(jù)了。函數(shù)ReadFile和Write
34、File的行為還受是否使用異步I/O (Overlapped )及通信超時(shí)設(shè)置的影響。串行口讀寫的同步、異步方式是在打開端口的同時(shí)給dwGlagsAndAttributes參數(shù)傳入適當(dāng)?shù)闹刀O(shè)定的。WriteFile()用途:向串口寫數(shù)據(jù)原型:BOOL WriteFile(HANDLE hFile,LPCVOID lpBuffer,DWORD nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWritten,LPOVERLAPPED lpOverlapped);參數(shù)說明:-hFile :串口句柄-lpBuffer :待寫入數(shù)據(jù)的首地址-nNumberOf
35、BytesToWrite :待寫入數(shù)據(jù)的字節(jié)數(shù)長度-lpNumberOfBytesWritten :函數(shù)返回的實(shí)際寫入串口的數(shù)據(jù)個(gè)數(shù)的地址,利用此變量可判斷實(shí)際寫入的字 節(jié)數(shù)和準(zhǔn)備寫入的字節(jié)數(shù)是否相同。-lpOverlapped: 重疊I/O結(jié)構(gòu)的指針ReadFile()用途:讀串口數(shù)據(jù)原型:BOOL ReadFile(HANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,lpNumberOfBytesRead,lpOverlapped);參數(shù)說明:-hFile :串口句柄-IpBuffer :存儲被讀出數(shù)據(jù)的首地址-nNumberOf
36、BytesToRead :準(zhǔn)備讀出的字節(jié)個(gè)數(shù)-NumberOfBytesRead :實(shí)際讀出的字節(jié)個(gè)數(shù)-IpOverlapped :異步 I/O 結(jié)構(gòu)在同步方式下,調(diào)用 ReadFile或WriteFile 后,當(dāng)實(shí)際讀寫操作完成或發(fā)生超時(shí)時(shí)才返回調(diào)用程序。而異步方式函數(shù)在啟動(dòng)接收或發(fā)送過程后立即返回,程序繼續(xù)向下執(zhí)行,程序在調(diào)用ReadFile和WriteFile時(shí)必須提供一個(gè) Overlapped數(shù)據(jù)結(jié)構(gòu)指針,該結(jié)構(gòu)中包含一個(gè)手動(dòng)事件同步對象,其后的程序必須借助于 該事件同步對象,完成數(shù)據(jù)的接收和發(fā)送過程。通信端口的超時(shí)設(shè)置對讀寫的處理方式也會產(chǎn)生影響,如果調(diào)用讀寫函數(shù)時(shí)發(fā)生端口超時(shí),則讀
37、寫函數(shù)立即返回并返回已傳輸?shù)臄?shù)據(jù)字節(jié)數(shù)。ReadFile函數(shù)只要在串行口輸入緩沖區(qū)中讀入指定數(shù)量的字符,就算完成操作。而WriteFile 函數(shù)不但要把指定數(shù)量的字符拷入到輸出緩沖中,而且要等這些字符從串行口送出去后才算完成操作。如果不再使用某一端口,須將該端口關(guān)閉,以便其他程序可以使用該端口。如果不顯式關(guān)閉某端口,當(dāng)程序退出時(shí)打開的端口也將被自動(dòng)關(guān)閉。但為了安全起見,最好是顯式的關(guān)閉它。關(guān)閉串口的語句為 CloseHandle()。CloseHandle()用途:關(guān)閉串口原型:BOOL CloseHandle(HANDLE hObjedt)說明:-hObjedt :串 口句柄操作說明:成功關(guān)
38、I串口時(shí)返回true,否則返回false當(dāng)ReadFile和WriteFile 返回FALSE時(shí),不一定就是操作失敗,線程應(yīng)該調(diào)用 GetLastError 函數(shù)分析返回的結(jié)果。例如,在重疊操作時(shí)如果操作還未完成函數(shù)就返回,那么函數(shù)就返回FALSE,而且GetLastError 函數(shù)返回ERROR_IO_PENDING如果GetLastError 函數(shù)返回ERROR_IO_PENDING11說明重疊操作還未完成,線 程可以等待操作完成。有兩種等待辦法:一種辦法是用象WaitForSingleObject這樣的等待函數(shù)來等待OVERLAPPED構(gòu)的hEvent成員,可以規(guī)定等待的時(shí)間,在等待函數(shù)
39、返回后,調(diào)用 GetOverlappedResult 。另一種辦法是調(diào)用 GetOverlappedResult 函數(shù)等待,如果指定該函數(shù)的bWait參數(shù)為TRUE那么該函數(shù)將等待OVERLAPPED構(gòu)的hEvent事件。GetOverlappedResult 可以返回一個(gè) OVERLAPPED構(gòu)來報(bào)告包括實(shí)際傳 輸字節(jié)在內(nèi)的重疊操作結(jié)果。如果規(guī)定了讀/寫操作的超時(shí),那么當(dāng)超過規(guī)定時(shí)間后,hEvent成員會變成有信號的。因此,在超時(shí)發(fā)生后,WaitForSingleObject 和 GetOverlappedResult 都會結(jié)束等待。WaitForSingleObject 的 dwMilli
40、seconds 參數(shù)會規(guī)定一個(gè)等待超時(shí),該函數(shù)實(shí)際等待的時(shí)間是兩個(gè)超時(shí)的最小值。注意GetOverlappedResult不能設(shè)置等待的時(shí)限,因此如果hEvent成員無信號,則該函數(shù)將一直等待下去GetOverlappedResult 函數(shù)調(diào)用方法如下:BOOL GetOverlappedResult(HANDLE hFile , /用CreateFile 獲得的文件句柄LPOVERLAPPED Overlapped , /指向一個(gè)在啟動(dòng)重疊操作時(shí)指定的OVERLAPPE躇構(gòu)(即/讀寫函數(shù)中指定的 OverLapped結(jié)構(gòu))LPDWORD lpNumberOfBytesTransferred,/實(shí)際傳輸?shù)淖止?jié)數(shù)BOOL bWait,/是否等待懸掛的重疊操作完成,若為 TRUE則此函數(shù)直到操作完成后才/返回。);OVERLAPPE躇構(gòu)定義如下:typedef struct _OVERLAPPED DWORD Internal;DWORD InternalHigh;DWORD Offset;DWORD OffsetHigh;HANDLE hEvent; OVERLAPPED;如果采用異步方式
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030全球電腦鎮(zhèn)痛泵行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025-2030全球電動(dòng)汽車高壓直流繼電器行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025年全球及中國IO-Link信號燈行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025年全球及中國堆棧式CMOS圖像傳感器行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 經(jīng)典居間合同
- 農(nóng)機(jī)作業(yè)服務(wù)合同
- 環(huán)保設(shè)施運(yùn)營管理合同
- 熱長期供貨合同
- 安全監(jiān)控系統(tǒng)集成服務(wù)合同
- 政府與企業(yè)合作協(xié)議
- 《西方思想經(jīng)典》課件
- 中醫(yī)診療設(shè)備種類目錄
- 戰(zhàn)略管理與倫理
- 如何構(gòu)建高效課堂課件
- 徐金桂行政法與行政訴訟法新講義
- 瀝青拌合設(shè)備結(jié)構(gòu)認(rèn)知
- GB/T 13234-2018用能單位節(jié)能量計(jì)算方法
- (課件)肝性腦病
- 北師大版五年級上冊數(shù)學(xué)教學(xué)課件第5課時(shí) 人民幣兌換
- 工程回訪記錄單
- 高考物理二輪專題課件:“配速法”解決擺線問題
評論
0/150
提交評論