void ChControlDlg::OnBnClickedSerialconnect()
{
// TODO: Add your control notification handler code here
Open=SerialConnect("COM1",9600);

ResumeThread(hCommThread);

}
BOOL ChControlDlg::SerialConnect(CString ComNum,DWORD Baud)
{

COMMTIMEOUTS DataComTimeOuts;
TCHAR szDataPort[15];
if(m_hComm==INVALID_HANDLE_VALUE)
{
配置串口信息;
         SetCommMask(m_hComm,EV_RXCHAR);
         PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
DWORD CthreadID;
hCommThread = ::CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0,
(LPTHREAD_START_ROUTINE)SerialThread, 
AfxGetMainWnd()-> m_hWnd, CREATE_SUSPENDED, &CthreadID);
if (hCommThread == NULL)
{
::AfxMessageBox(_T("创建串口1处理线程失败!"));
::PostQuitMessage(0);
}
return TRUE;
}
return FALSE;
}
DWORD WINAPI SerialThread(HWND hWnd)
{
ChControlDlg* mpSerial;
mpSerial=new ChControlDlg;
OVERLAPPED osStatus;
memset(&osStatus,0,sizeof(OVERLAPPED));
osStatus.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
DWORD dwCommEvent;
BOOL bCommState; if(!SetCommMask(m_hComm,EV_RXCHAR))
{
TRACE("SetCommMask failed!\n");
CloseHandle(m_hComm);
return 0;
}
TRACE("SetCommMask success!\n");
if(osStatus.hEvent ==NULL)
//错误处理
return 0; for(;;)
{
bCommState=WaitCommEvent(m_hComm,&dwCommEvent,&osStatus);
if((dwCommEvent&EV_RXCHAR)==EV_RXCHAR)
{
mpSerial->ReadSerail();
::PostMessage(hWnd, WM_NEW_DATA_ARRIVE, (WPARAM)lpInBuffer, dwBytesRead); 
}
}
CloseHandle(osStatus.hEvent);
return TRUE;
}
DWORD ChControlDlg::ReadSerail()
{

OVERLAPPED m_osRead;
memset(&m_osRead,0,sizeof(OVERLAPPED));
m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); //char lpInBuffer[1024];  
//DWORD dwBytesRead=1024; 
memset(lpInBuffer,0,1024); //清空数据缓冲区
dwBytesRead=1024;  BOOL bReadStat;  
DWORD dwErrorFlags;  
COMSTAT ComStat;    
ClearCommError(m_hComm,&dwErrorFlags,&ComStat);  
if(!ComStat.cbInQue) //输入缓冲区的字节数 
return 0;  
dwBytesRead=min(dwBytesRead,(DWORD)ComStat.cbInQue);  
bReadStat=ReadFile(m_hComm, lpInBuffer,dwBytesRead,&dwBytesRead,&m_osRead);  
if(!bReadStat) //如果ReadFile函数返回FALSE  
{  
if(GetLastError()==ERROR_IO_PENDING) 
//GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作
{  
WaitForSingleObject(m_osRead.hEvent,2000);
//使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2秒钟
//当串口读操作进行完毕后,m_osRead的hEvent事件会变为有信号
return dwBytesRead;  
}  
return 0;  
}
PurgeComm(m_hComm, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); 
//清空串口的输入输出缓冲区
return dwBytesRead;  
}程序卡死。如果把监听线程的for(;;)注释了,并且将hCommThread创建线程放到if语句外之后,则程序点击一次接收一次并显示到界面上。表明接收程序应该没问题吧。但是启用了for以后程序就会卡死,并且不会显示了。这是什么原因啊?一直找不到原因。全部分贴出来了,求大神解答

解决方案 »

  1.   

    WaitCommEvent 也应该判断 GetLastError()==ERROR_IO_PENDING好好看看MSDN的例子
    http://msdn.microsoft.com/en-us/library/ff802693.aspx另外线程中使用PostMessag,而缓冲区参数和长度是和主线程公用的,会产生冲突
      

  2.   

    for(;;){} 这是个死循环,程序当然会卡死。
      

  3.   

    好像不是这个原因哦,单步调试的时候各个参数显示一切正常的啊,而且我每次进入readserial的时候都对lpINBuffer置零了
      

  4.   

    csdn网盘在哪里哦 没找到 0 0