麻烦各位高手给看一下,调试运行到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;
}
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;
}
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);
[email protected]