麻烦各位高手给看一下,调试运行到ReadComm,但数据不会显示,好象线程也被堵塞!
CWinThread* m_pThread;    //辅助线程
volatile HWND m_hTermWnd;   //辅助窗口
volatile HANDLE m_hPostMsgEvent;  //用于WM_COMMNOTIFY消息的事件对象
OVERLAPPED m_osRead;              //用于重叠读
volatile HANDLE m_hCom;           //串行口句柄
char buf[1024];
void CFMVCDlg::OnButtonSend() 
{
m_pThread=AfxBeginThread(ComProc,this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL);
if(m_pThread==NULL)
CloseHandle(m_hCom);
else
m_pThread->ResumeThread();
}
//工作者线程,负责监视串口
UINT ComProc(LPVOID pParam)
{
CFMVCDlg* pDlg=(CFMVCDlg*)pParam;
DWORD dwMask,dwTrans,willRead;
COMSTAT ComStat;
DWORD dwErrorFlags;
OVERLAPPED os;
memset(&os,0,sizeof(OVERLAPPED));
os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if(os.hEvent==NULL)
{
AfxMessageBox("创建串口事件失败!");
return -1;
}
for(;;)
{
ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
if(ComStat.cbInQue)
{
WaitForSingleObject(pDlg->m_hPostMsgEvent,INFINITE);
ResetEvent(pDlg->m_hPostMsgEvent);
willRead=ComStat.cbInQue;
  pDlg->PostMessage(WM_COMMNOTIFY,EV_RXCHAR,0);
continue;
}
dwMask=0;
if(!WaitCommEvent(m_hCom,&dwMask,&os))
{
if(GetLastError()==ERROR_IO_PENDING)
GetOverlappedResult(m_hCom,&os,&dwTrans,TRUE);
}
}
CloseHandle(os.hEvent);
return 0;
}
//读取数据并送编辑框
void CFMVCDlg::ReadComm(char *buf,DWORD dwLength)
{
CString strRead;
CString strTem;
DWORD length=0;
COMSTAT ComStat;
DWORD dwErrorFlags;
ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
length=min(dwLength,ComStat.cbInQue);
DWORD dwRead=ReadFile(m_hCom,buf,length,&length,&m_osRead);
if(dwRead)
{
strTem.Format("%d",length);
strRead=buf;
if(!m_sReceivearea.IsEmpty())
{
m_sReceivearea=m_sReceivearea+"\r\n"+strRead;
m_cReceivearea.SetWindowText(m_sReceivearea);
}
else
{
m_sReceivearea=strRead;
m_cReceivearea.SetWindowText(m_sReceivearea);
}
m_sReceivebyte=strTem;
UpdateData(FALSE);
}}
//取消串口监控
void CFMVCDlg::OnButton2() 
{
SetEvent(m_hPostMsgEvent);
SetCommMask(m_hCom,0);
WaitForSingleObject(m_pThread->m_hThread,INFINITE);
m_pThread=NULL;
CloseHandle(m_hCom);
}
//消息响应
LRESULT CFMVCDlg::OnCommNotify(WPARAM wParam,LPARAM lParam)
{

CString str;
//int nLength,nTextLength;
if((wParam&EV_RXCHAR)!=EV_RXCHAR)
{
SetEvent(m_hPostMsgEvent);
return 0L;
}
ReadComm(buf,100);
SetEvent(m_hPostMsgEvent);
return 0L;
}

解决方案 »

  1.   

    可能是串口打开和TimeOut设置不对,参考下面
    m_hComDev = CreateFile( szBuffer, GENERIC_READ | GENERIC_WRITE,
      0,                    // exclusive access
      NULL,                 // no security attrs
      OPEN_EXISTING,
      FILE_ATTRIBUTE_NORMAL |
      FILE_FLAG_OVERLAPPED , // overlapped I/O
      NULL);
    if(m_hComDev == INVALID_HANDLE_VALUE) 
    {
    m_hComDev = 0;
    return FALSE;
    } CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF ;
    CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ;
    CommTimeOuts.ReadTotalTimeoutConstant = 1000 ;
    CommTimeOuts.WriteTotalTimeoutMultiplier = 2 * CBR_9600 / nBaud;
    CommTimeOuts.WriteTotalTimeoutConstant = 0 ;
    SetCommTimeouts(m_hComDev, &CommTimeOuts);
      

  2.   

    我帮你看看!
    [email protected]
      

  3.   

    程序在WaitForSingleObject(pDlg->m_hPostMsgEvent,INFINITE);这条语句好象有问题,当接收数据时断点只能设置在这!请大家帮我看看!