MFC 시리얼통신 쓰레드와 맵핑관련
메인 다이얼로그에서 메뉴를통해 새창을 열어 포트값과 보레이트를 입력하게 만들었는데요
Send도 가는거 확인했고 쓰레드도 잘되고 맵핑도 제대로 했는데 리시브가 안됩니다.
디버깅으로 확인도 다 해봤는데 도대체 안들어가는 이유를 모르겠습니다.
while (Comm->m_bIsOpenned)
{
EvtMask = 0;
Length = 0;
insize = 0;
memset(buf,'\0',MAXBUF);
// 이벤트를 기다림
WaitCommEvent(Comm->m_hComDev,&EvtMask, NULL);
ClearCommError(Comm->m_hComDev, &ErrorFlags, &ComStat);
// EV_RXCHAR에서 이벤트가 발생하면
if ((EvtMask & EV_RXCHAR) && ComStat.cbInQue)
{
if (ComStat.cbInQue > MAXBUF)
size = MAXBUF;
else
size = ComStat.cbInQue;
do
{
ClearCommError(Comm->m_hComDev, &ErrorFlags, &ComStat);
// overlapped I/O를 통해 데이터를 읽음
if (!ReadFile(Comm->m_hComDev,buf+insize,size,&Length,&(Comm->m_OLR)))
{
TRACE("Error in ReadFile\n");
if (GetLastError() == ERROR_IO_PENDING)
{
if (WaitForSingleObject(Comm->m_OLR.hEvent, 1000) != WAIT_OBJECT_0)
Length = 0;
else
GetOverlappedResult(Comm->m_hComDev,&(Comm->m_OLR),&Length,FALSE);
}
else
Length = 0;
}
insize += Length;
}
while ((Length!=0) && (insize
ClearCommError(Comm->m_hComDev, &ErrorFlags, &ComStat);
if (Comm->m_nLength + insize > MAXBUF*2)
insize = (Comm->m_nLength + insize) - MAXBUF*2;
// 이벤트 발생을 잠시 중단하고 input buffer에 데이터를 복사
Comm->m_pEvent->ResetEvent();
memcpy(Comm->m_sInBuf+Comm->m_nLength,buf,insize);
Comm->m_nLength += insize;
// 복사가 끝나면 다시 이벤트를 활성화 시키고
Comm->m_pEvent->SetEvent();
LPARAM temp=(LPARAM)Comm;
// 데이터가 들어왔다는 메시지를 발생
SendMessage(Comm->m_hWnd,WM_MYRECEIVE,Comm->m_nLength,temp);
}
}
위에 sendMessage부분 확실하게 들어가구요
BEGIN_MESSAGE_MAP(CSTestDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_MESSAGE(WM_MYCLOSE, &CSTestDlg::OnThreadClosed)
ON_MESSAGE(WM_MYRECEIVE,&CSTestDlg::OnReceive)
ON_WM_QUERYDRAGICON()
ON_COMMAND(ID_32772, &CSTestDlg::OnSetting)
ON_BN_CLICKED(IDC_BT_SEND, &CSTestDlg::OnBnClickedBtSend)
END_MESSAGE_MAP()
맵핑도했습니다.
핸들문제인것도 같은데 왜그런지 모르겠네요 ㅠ
본문 소스만 봐선
Comm->m_hWnd에 윈도 핸들이 제대로 들어갔다는 보장이 없네요. (다른 부분에서 하셨을 수도 있지만.)
SendMessage의 리턴값은 확인해 보셨는지요.
데이터 수신시, 수신부 처리에 진입 자체를 못했을 수도 있으니 거기에도 브레이크 포인트를 걸어 보시고요. EV_RXCHAR를 검사하는 바로 밑에줄에다 걸고서 데이터를 발생시켜보면 되겠습니다.
--
감사합니다
지적해주신 부분을 Comm->m_hWnd=AfxGetMainWnd()->m_hWnd로 바꾸니 되네요 감사합니다.
저도 스레드도 잘돌고 메세지맵 맵핑도 해보았지만 안되네요... AfxGetMainWnd 핸들을 가지고 와도 마찬가지
AfxGetMainWnd 핸들을 가지고 와도 마찬가지로 receive쪽으로 메세지가 넘어가지 않습니다. ㅠㅠ
댓글 달기