果.例如,在重叠操作时如果操作还未完成函数就返回,那么函数就返回FALSE,而且GetLastError函数返回ERROR_IO_PENDING.这说明重叠操作还未完成.
下面是同步方式读写串口的示例: //同步读串口 char str[100];
DWORD wCount;//读取的字节数 BOOL bReadStat;
bReadStat=ReadFile(hCom,str,100,&wCount,NULL; if(!bReadStat {
MessageBox(\读串口失败!\return FALSE; }
return TRUE; //同步写串口 char lpOutBuffer[100]; DWORD dwBytesWrite=100; COMSTAT ComStat; DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat;
bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,& dwBytesWrite,NULL; if(!bWriteStat
{
MessageBox(\写串口失败!\}
PurgeComm(hCom, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR; 在重叠操作时,操作还未完成函数就返回.
重叠I/O非常灵活,它也可以实现阻塞(例如我们可以设置一定要读取到一个数据 才能进行到下一步操作.有两种方法可以等待操作完成:一种方法是用象 WaitForSingleObject这样的等待函数来等待OVERLAPPED结构的hEvent成员;另一种方法是调用GetOverlappedResult函数等待,后面将演示说明.
下面先简单介绍一下OVERLAPPED结构和GetOverlappedResult函数: OVERLAPPED结构
OVERLAPPED结构包含了重叠I/O的一些信息,定义如下: typedef struct _OVERLAPPED { DWORD Internal;
DWORD InternalHigh; DWORD Offset; DWORD OffsetHigh; HANDLE hEvent; } OVERLAPPED;
在使用ReadFile和WriteFile重叠操作时,线程需要创建OVERLAPPED结构以供这两个函数使用.线程通过OVERLAPPED结构获得当前的操作状态,该结构最重要的成
员是hEvent.hEvent是读写事件.当串口使用异步通讯时,函数返回时操作可能还没有完成,程序可以通过检查该事件得知是否读写完毕.
当调用ReadFile, WriteFile 函数的时候,该成员会自动被置为无信号状态;当重叠操作完成后,该成员变量会自动被置为有信号状态.
GetOverlappedResult函数 BOOL GetOverlappedResult( HANDLE hFile,//串口的句柄
//指向重叠操作开始时指定的OVERLAPPED结构 LPOVERLAPPED lpOverlapped,
//指向一个32位变量,该变量的值返回实际读写操作传输的字节数. LPDWORD lpNumberOfBytesTransferred,
//该参数用于指定函数是否一直等到重叠操作结束.
//如果该参数为TRUE,函数直到操作结束才返回.
//如果该参数为FALSE,函数直接返回,这时如果操作没有完成, //通过调用GetLastError(函数会返回ERROR_IO_INCOMPLETE. BOOL bWait ;
该函数返回重叠操作的结果,用来判断异步操作是否完成,它是通过判断OVERLAPPED结构中的hEvent是否被置位来实现的.
异步读串口的示例: char lpInBuffer[1024]; DWORD dwBytesRead=1024; COMSTAT ComStat; DWORD dwErrorFlags; OVERLAPPED m_osRead;
memset(&m_osRead,0,sizeof(OVERLAPPED;
m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL; ClearCommError(hCom,&dwErrorFlags,&ComStat;
dwBytesRead=min(dwBytesRead,(DWORDComStat.cbInQue; if(!dwBytesRead return FALSE;
相关推荐: