UINT CommWatchProc(LPVOID pParam)
{
DWORD dwEventMask;//=0;
CMyTestCommDlg* tempcom=(CMyTestCommDlg*)pParam;
SetCommMask(hCom,EV_ERR|EV_RXCHAR);
//OVERLAPPED osRead;
//memset(&osRead,0,sizeof(OVERLAPPED));
//osRead.Offset=0;
//osRead.OffsetHigh=0;
//osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
LPOVERLAPPED os=&tempcom->osRead;
BOOL statetem=WaitCommEvent(hCom,&dwEventMask,os);//?????
ATLTRACE("hCom=%d os->InternalHigh=%d dwEventMask=%x statetem=%d\n",hCom,os->InternalHigh,dwEventMask,statetem);
if ((dwEventMask&EV_RXCHAR)==EV_RXCHAR)
{
COMSTAT comstat;
DWORD dwLength;
DWORD dwErrorFlags;
ClearCommError(hCom,&dwErrorFlags,&comstat);
dwLength=comstat.cbInQue;
ATLTRACE("dwLength=%d\n",dwLength);
if(dwLength>0)
{
BOOL fReadStat;
char str[201];
DWORD count;
fReadStat = ReadFile(hCom,&str,200,&count,os);//读数据
str[count]=0;
if(!fReadStat)
{
if(GetLastError()==ERROR_IO_PENDING)
{
while(!GetOverlappedResult(hCom,os,&count,TRUE))
{
DWORD dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE) continue;//缓冲区数据没有读完,继续
}
}
}
::PostMessage(tempcom->m_hWnd,COM_RECVDATA,(unsigned int)str,count);//接收到字符事件后,可以将此消息登记到由pParam有指定的窗口类中进行处理
}
}
if((dwEventMask&EV_ERR)==EV_ERR)
{
...
}
return 0;
}
以上是部分代码,目前状况是:另外一台电脑隔1s发数据,运行exe可是却不能收到数据.ATLTRACE检测到,dwEventMask为cccccccc(初始值),返回值statetem为0.而如果debug下断点,运行到BOOL statetem=WaitCommEvent(hCom,&dwEventMask,os);则可以发现dwEventMask为129,这样可以进入事件函数体中,但同样接收不到串口的数据。有谁知道是什么原因呢?
{
DWORD dwEventMask;//=0;
CMyTestCommDlg* tempcom=(CMyTestCommDlg*)pParam;
SetCommMask(hCom,EV_ERR|EV_RXCHAR);
//OVERLAPPED osRead;
//memset(&osRead,0,sizeof(OVERLAPPED));
//osRead.Offset=0;
//osRead.OffsetHigh=0;
//osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
LPOVERLAPPED os=&tempcom->osRead;
BOOL statetem=WaitCommEvent(hCom,&dwEventMask,os);//?????
ATLTRACE("hCom=%d os->InternalHigh=%d dwEventMask=%x statetem=%d\n",hCom,os->InternalHigh,dwEventMask,statetem);
if ((dwEventMask&EV_RXCHAR)==EV_RXCHAR)
{
COMSTAT comstat;
DWORD dwLength;
DWORD dwErrorFlags;
ClearCommError(hCom,&dwErrorFlags,&comstat);
dwLength=comstat.cbInQue;
ATLTRACE("dwLength=%d\n",dwLength);
if(dwLength>0)
{
BOOL fReadStat;
char str[201];
DWORD count;
fReadStat = ReadFile(hCom,&str,200,&count,os);//读数据
str[count]=0;
if(!fReadStat)
{
if(GetLastError()==ERROR_IO_PENDING)
{
while(!GetOverlappedResult(hCom,os,&count,TRUE))
{
DWORD dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE) continue;//缓冲区数据没有读完,继续
}
}
}
::PostMessage(tempcom->m_hWnd,COM_RECVDATA,(unsigned int)str,count);//接收到字符事件后,可以将此消息登记到由pParam有指定的窗口类中进行处理
}
}
if((dwEventMask&EV_ERR)==EV_ERR)
{
...
}
return 0;
}
以上是部分代码,目前状况是:另外一台电脑隔1s发数据,运行exe可是却不能收到数据.ATLTRACE检测到,dwEventMask为cccccccc(初始值),返回值statetem为0.而如果debug下断点,运行到BOOL statetem=WaitCommEvent(hCom,&dwEventMask,os);则可以发现dwEventMask为129,这样可以进入事件函数体中,但同样接收不到串口的数据。有谁知道是什么原因呢?
解决方案 »
- 简单问题:用vc如何实现表格啊,支持插入,删除修改,数据从数据库来,最好有例子。
- 华为公司招聘C/C++/Java人才...
- 大哥大姐:用 MFC 开发游戏,请问用什么函数打开声音资源阿?(在线等待)
- ●●100分!!!●怎样把csdn专家门诊里的资料全部下载到本地???用离线吗???
- 逐个读取一个字符串CString中的内容,CString中既有中文也有英文,怎样才能区分读到的是中文还是英文?
- 为什么这个映射消息在对话框程序中不执行?
- 请教:灰度图像膨胀与腐蚀
- CMemFile是如何使用的,最好有例子,从分配到写数据、读数据并释放
- 我想做一个简单的文本编辑器,想了解一些思路,最好能有源码。
- 关于消息的响应
- 重叠I/O的重叠是什么意思?
- 请问如何用VC实现PING的功能?
你这个osRead是怎么创建的?出现错误后最好用GetLastErrot()看看错误代码,查找错误原因。
现在解决了,问题是我对异步I/O标志参数没有弄好,上面代码里WaitCommEvent和ReadFile的异步参数混用了...
我也是用GetLastError得到提示的