做串口通信,开始用到事件处理。
bReadStatus = ReadFile( m_hComDev, buffer, dwBytesRead, &dwBytesRead, &m_OverlappedRead );
这是我们读数据时会写的函数,这儿存在一些疑问:m_OverlappedRead是我们创的一个句柄
m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );那么在ReadFile未完成时m_OverlappedRead.hEvent是什么状态,完成时又是什么状态?,如果这些状态都是系统自动设定,那么我们为何要设成是手动句柄呢?
我做了一个函数,之前设置了一个事件(在OpenComm()中完成:SetCommMask(m_hComDev,EV_RXCHAR,然后在每次读数据之前用WaitForRead()等待是否有数据发生。
函数如下:
int CReadBinDlg::WaitForRead()
{
OVERLAPPED os;
DWORD dwMask=0,dwTrans=0;
COMSTAT ComStat;
DWORD dwErrorFlags;
memset(&os,0,sizeof(OVERLAPPED));
os.hEvent =CreateEvent(NULL,TRUE,FALSE,NULL);
if(os.hEvent ==NULL)
{
AfxMessageBox("Can't create event object!");
return (UINT)-1;
}
ClearCommError(m_hComDev,&dwErrorFlags,&ComStat);
if(ComStat.cbInQue)
{
CloseHandle(os.hEvent);
return 0;
}
dwMask=0;
if(!WaitCommEvent(m_hComDev,&dwMask,&os))
{
if(GetLastError()==ERROR_IO_PENDING)
//无限等待重叠操作结果
{
GetOverlappedResult(m_hComDev,&os,&dwTrans,TRUE);
}
else {
CloseHandle(os.hEvent);
return (UINT)-1;
}
} CloseHandle(os.hEvent );
return 0;
}
我发现WaitForRead()好像并不与m_OverlappedRead有什么关系,那它又是如何判断GetOverlappedResult(m_hComDev,&os,&dwTrans,TRUE);已完成呢?这里不态理解,因为它们是在同一个线程里的,等待有事件发生,然后就开始读,否则就停在GetOverlappedResult()上。
望高手能解答,不胜感谢
bReadStatus = ReadFile( m_hComDev, buffer, dwBytesRead, &dwBytesRead, &m_OverlappedRead );
这是我们读数据时会写的函数,这儿存在一些疑问:m_OverlappedRead是我们创的一个句柄
m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );那么在ReadFile未完成时m_OverlappedRead.hEvent是什么状态,完成时又是什么状态?,如果这些状态都是系统自动设定,那么我们为何要设成是手动句柄呢?
我做了一个函数,之前设置了一个事件(在OpenComm()中完成:SetCommMask(m_hComDev,EV_RXCHAR,然后在每次读数据之前用WaitForRead()等待是否有数据发生。
函数如下:
int CReadBinDlg::WaitForRead()
{
OVERLAPPED os;
DWORD dwMask=0,dwTrans=0;
COMSTAT ComStat;
DWORD dwErrorFlags;
memset(&os,0,sizeof(OVERLAPPED));
os.hEvent =CreateEvent(NULL,TRUE,FALSE,NULL);
if(os.hEvent ==NULL)
{
AfxMessageBox("Can't create event object!");
return (UINT)-1;
}
ClearCommError(m_hComDev,&dwErrorFlags,&ComStat);
if(ComStat.cbInQue)
{
CloseHandle(os.hEvent);
return 0;
}
dwMask=0;
if(!WaitCommEvent(m_hComDev,&dwMask,&os))
{
if(GetLastError()==ERROR_IO_PENDING)
//无限等待重叠操作结果
{
GetOverlappedResult(m_hComDev,&os,&dwTrans,TRUE);
}
else {
CloseHandle(os.hEvent);
return (UINT)-1;
}
} CloseHandle(os.hEvent );
return 0;
}
我发现WaitForRead()好像并不与m_OverlappedRead有什么关系,那它又是如何判断GetOverlappedResult(m_hComDev,&os,&dwTrans,TRUE);已完成呢?这里不态理解,因为它们是在同一个线程里的,等待有事件发生,然后就开始读,否则就停在GetOverlappedResult()上。
望高手能解答,不胜感谢
解决方案 »
- 各位大神,列表控件添加行怎么弄喔,咋修改都不行
- windows socket中使用IOCP,设置socket接受超时无效?
- 编译的程序,生成DEBUG没错,但生存release就报错,为什么?
- Is the control is properly registered?
- 救命啊!!!Invalid Address specified to RtlSizeHeap( 00150000, 00193A90 )
- SDI工程中如何创建一个新的FRAME/VIEW窗口?
- 问一个很菜的问题,怎么把ICO/BMP中的图标做成工具栏的按钮?
- 如何把一个文本的内容读到数据库中去,再把数据库里的数据保存成文本?
- 只运行一个MDICHILD窗口
- 两机用winsock联接后,怎么才能远程访问对方的硬盘?(象自己的硬盘一样)
- 请问哪有VC 6.0下载?
- 高分求救:VC有没有类示于Excel表格的控件
BOOL ZComm::WaitEventChar()
{
OVERLAPPED os ;
DWORD dwEvtMask,Errors;
COMSTAT Stat; memset( &os, 0, sizeof( OVERLAPPED ));
os.hEvent = CreateEvent( NULL, // no security
TRUE, // explicit reset req
FALSE, // initial event nonsignaled.
NULL ) ; // no name
dwEvtMask = 0 ;
WaitCommEvent(idComDev,&dwEvtMask,&os);
if (WaitForSingleObject(os.hEvent,MAXTIMEOUT)==WAIT_TIMEOUT)
{
CloseHandle(os.hEvent);
return false;
}
else if ((dwEvtMask & EV_RXFLAG) == EV_RXFLAG)
{
CloseHandle(os.hEvent);
ClearCommError(idComDev,&Errors, &Stat);
return true;
}else
{
CloseHandle(os.hEvent);
return false;
}}
这是我们读数据时会写的函数,这儿存在一些疑问:m_OverlappedRead是我们创的一个句柄
m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );那么在ReadFile未完成时m_OverlappedRead.hEvent是什么状态,完成时又是什么状态?,如果这些状态都是系统自动设定,那么我们为何要设成是手动句柄呢?
我做了一个函数,之前设置了一个事件(在OpenComm()中完成:SetCommMask(m_hComDev,EV_RXCHAR,然后在每次读数据之前用WaitForRead()等待是否有数据发生。
我发现WaitForRead()好像并不与m_OverlappedRead有什么关系,那它又是如何判断GetOverlappedResult(m_hComDev,&os,&dwTrans,TRUE);已完成呢?这里不态理解,因为它们是在同一个线程里的,等待有事件发生,然后就开始读,否则就停在GetOverlappedResult()上。