MFC 시리얼통신 쓰레드와 맵핑관련

momark의 이미지

메인 다이얼로그에서 메뉴를통해 새창을 열어 포트값과 보레이트를 입력하게 만들었는데요

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()

맵핑도했습니다.

핸들문제인것도 같은데 왜그런지 모르겠네요 ㅠ

mirheekl의 이미지

Comm->m_hWnd에 윈도 핸들이 제대로 들어갔다는 보장이 없네요. (다른 부분에서 하셨을 수도 있지만.)

SendMessage의 리턴값은 확인해 보셨는지요.

데이터 수신시, 수신부 처리에 진입 자체를 못했을 수도 있으니 거기에도 브레이크 포인트를 걸어 보시고요. EV_RXCHAR를 검사하는 바로 밑에줄에다 걸고서 데이터를 발생시켜보면 되겠습니다.

--

momark의 이미지

지적해주신 부분을 Comm->m_hWnd=AfxGetMainWnd()->m_hWnd로 바꾸니 되네요 감사합니다.

익명 사용자의 이미지

AfxGetMainWnd 핸들을 가지고 와도 마찬가지로 receive쪽으로 메세지가 넘어가지 않습니다. ㅠㅠ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.