我写一个串口通讯的程序, 用线程侦听接收字符的消息, 奇怪的是,我在DEBUG下运行一切正常, 在RELEASE下运行就会出错, 就是那种“‘0x6bc41351’指令引用的‘0x0000043c’内存。该内存不能为‘read’”的错。我将程序摆出来,各位大哥请帮忙!线程:
UINT CommProc(LPVOID pParam)
{
OVERLAPPED os;
DWORD dwMask, dwTrans;
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;
} while(flag_thread)//打开线程
{
//memset(&ComStat, 0, sizeof(COMSTAT));
ClearCommError(cs.m_hIDComDev, &dwErrorFlags, &ComStat); if(ComStat.cbInQue)//如果串口缓冲仍有字节
{
if(ComStat.cbInQue < 3)
continue;
// 通知视图
PostMessage(pDlg, WM_FOUNDCHAR, 0, 0);
// 无限等待WM_COMMNOTIFY消息被处理完
WaitForSingleObject(m_hPostMsgEvent, INFINITE);
ResetEvent(m_hPostMsgEvent); continue;
} // 缓冲中没有数据了 dwMask=0; if(!WaitCommEvent(cs.m_hIDComDev, &dwMask, &os)) {
if(GetLastError() == ERROR_IO_PENDING)
GetOverlappedResult(cs.m_hIDComDev, &os, &dwTrans, TRUE);
else {
CloseHandle(os.hEvent);
return (UINT)-1;
}
}
} CloseHandle(os.hEvent);
return 0;
}
发送到主界面的消息的处理函数:
void CDlg::OnReceiveChar()//线程发来消息的处理函数(收到字符消息)
{
char buffer[1200];
DWORD lenReceive; memset(buffer, 0x00, 1200);
lenReceive = cs.ReadData(buffer);
MessageBox(buffer);
SetEvent(m_hPostMsgEvent); //发生
}
其中cs是自己写的一个串口读写类,应该是没有问题。程序运行后,只要串口接收到字符,首先它可以正确读出来并MessageBox给我,紧接着就报错,这是怎么回事? 怎么DEBUG时就好好的?谢谢高手指点!
UINT CommProc(LPVOID pParam)
{
OVERLAPPED os;
DWORD dwMask, dwTrans;
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;
} while(flag_thread)//打开线程
{
//memset(&ComStat, 0, sizeof(COMSTAT));
ClearCommError(cs.m_hIDComDev, &dwErrorFlags, &ComStat); if(ComStat.cbInQue)//如果串口缓冲仍有字节
{
if(ComStat.cbInQue < 3)
continue;
// 通知视图
PostMessage(pDlg, WM_FOUNDCHAR, 0, 0);
// 无限等待WM_COMMNOTIFY消息被处理完
WaitForSingleObject(m_hPostMsgEvent, INFINITE);
ResetEvent(m_hPostMsgEvent); continue;
} // 缓冲中没有数据了 dwMask=0; if(!WaitCommEvent(cs.m_hIDComDev, &dwMask, &os)) {
if(GetLastError() == ERROR_IO_PENDING)
GetOverlappedResult(cs.m_hIDComDev, &os, &dwTrans, TRUE);
else {
CloseHandle(os.hEvent);
return (UINT)-1;
}
}
} CloseHandle(os.hEvent);
return 0;
}
发送到主界面的消息的处理函数:
void CDlg::OnReceiveChar()//线程发来消息的处理函数(收到字符消息)
{
char buffer[1200];
DWORD lenReceive; memset(buffer, 0x00, 1200);
lenReceive = cs.ReadData(buffer);
MessageBox(buffer);
SetEvent(m_hPostMsgEvent); //发生
}
其中cs是自己写的一个串口读写类,应该是没有问题。程序运行后,只要串口接收到字符,首先它可以正确读出来并MessageBox给我,紧接着就报错,这是怎么回事? 怎么DEBUG时就好好的?谢谢高手指点!
::SendMessage
因为POSTMESSAGE是可被堵塞的。
或者象其他人说的,SENDMESSAGE可能会好点。
既然,用了事件,最好收发都是放在线程里。
请参考:如急需我有完整的程序。DWORD FAR PASCAL CommWatchProc(LPSTR)
{ DWORD dwEvtMask;
OVERLAPPED os;
int nLength;
BYTE abIn[1024]; memset(&os,0,sizeof(OVERLAPPED)); // create I/O event used for overlapped read os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if (os.hEvent==NULL)
{ MessageBox(NULL,"Failed to create event for thread!","GPS Error!",MB_ICONEXCLAMATION|MB_OK);
return ( FALSE ) ;
} if (!SetCommMask(COMDEV(npGPSInfo),EV_RXCHAR)) return (FALSE);
while (CONNECTED( npGPSInfo))
{ dwEvtMask=0 ;
WaitCommEvent(COMDEV(npGPSInfo),&dwEvtMask,NULL);
if ((dwEvtMask&EV_RXCHAR)==EV_RXCHAR)
{ do
{ if (nLength=ReadCommBlock((LPSTR)abIn,1024))
{ //WriteCommBlock((LPSTR)abIn,nLength );
*(abIn+nLength)=0;
::SendMessage(hGPSWnd,CN_SEND,nLength,(LONG)(LPSTR)abIn);
}
}
while ((nLength>0)&&(CONNECTED( npGPSInfo)));
}
} CloseHandle(os.hEvent);
THREADID(npGPSInfo)=0;
HTHREAD(npGPSInfo)=NULL;
return(TRUE);
}