<µ¥ÀÌÅÍ Çüº¯È¯>

ÇöÀç ÇÁ·Î±×·¥ »ó¿¡¼­ ¿¡µðÅÍ Ã¢À¸·Î ÀԷ¹ÞÀº ¾Æ½ºÅ° µ¥ÀÌÅÍ 20¹ÙÀÌÆ®¸¦ Çí»ç°ª 10¹ÙÀÌÆ®·Î ¹Ù²ã¼­ ÀúÀåÇÑ ÈÄ Àü¼ÛÇÏ·Á ÇÕ´Ï´Ù. ¿¹¸¦ µé¸é '3', '2' (ASCII - 2 byte)¸¦ ÀÔ·Â¹Þ¾Æ Çí»ç°ª '32'·Î ÀúÀåÇÏ·Á´Â °ÍÀÌÁö¿ä(HEXA - 1 byte).

'3' '2' 'A' '2' '1' ....'9' '9' '0' (È­¸é»ó¿¡¼­ 20ÀÚ¸® µ¥ÀÌÅÍ ÀÔ·Â)
'32' 'A2' 1 .... '90' (½ÇÁ¦ÀûÀ¸·Î ÀúÀåµÇ´Â °ªÀº 10ÀÚ¸® Çí»ç°ªÀÇ µ¥ÀÌÅÍ)

10ÀÚ¸®·Î Á¤ÀÇµÈ Çí»ç°ªÀº ´Ù½Ã ¹®ÀÚ¿­ ¹öÆÛ¿¡ ÀúÀåµÇ¼­ Àü¼ÛµÅ¾ß Çϴµ¥ °£´ÜÇÑ ¹®Á¦¸¦ Á¦°¡ ³Ê¹« ¾î·Æ°Ô »ý°¢ÇÏ°í ÀÖ´ÂÁöµµ ¸ð¸£°Ú½À´Ï´Ù. ¹æ¹ýÀ» ¾Ë·ÁÁÖ¼¼¿ä.

´ÙÀ½Àº ´ÙÀ̾ó·Î±×ÀÇ ¿¡µðÆ® ÄÁÆ®·Ñ¿¡¼­ Çí»ç°ªÀ» ÀÔ·Â¹Þ¾Æ RS232 Æ÷Æ®·Î ³¯¸®´Â ³»¿ëÀÇ ÄÚµåÀÔ´Ï´Ù.

Çí»ç°ª ÀԷ¹ޱâ

´ÙÀ̾ó·Î±×ÀÇ ¿¡µðÆ® ¹Ú½º ÄÁÆ®·Ñ¿¡¼­ ƯÁ¤ÇÑ ¹®ÀÚ¸¸ ÀÔ·Â¹Þ°Ô ÇÕ´Ï´Ù.

[1] ´ÙÀ̾ó·Î±× ¸®¼Ò½º¿¡¼­ ¿¡µðÆ® ¹Ú½º¸¦ Çϳª ¸¸µì´Ï´Ù.

[2] Ŭ·¡½º À§Àúµå¿¡¼­ ¿¡µðÆ® ¹Ú½º ÄÁÆ®·Ñ º¯¼ö¸¦ Çϳª ¼³Á¤ÇÕ´Ï´Ù.

[3] Ŭ·¡½º À§Àúµå¿¡¼­ ¿¡µðÆ® ¹Ú½º ÄÁÆ®·ÑÀÇ EN_CHANGE ÇÔ¼ö¸¦ ¸¸µé°í ´ÙÀ½°ú °°ÀÌ ÄÚµùÇÕ´Ï´Ù.

void CMyDlg::OnChangeEditAddress()
{
     // send this notification unless you override the CDialog::OnInitDialog()
     // function to send the EM_SETEVENTMASK message to the control
     // with the ENM_CHANGE flag ORed into the lParam mask.

     int i, j, len, nbytes, pos1, pos2;
     char *line, *newline;

     m_EBCaddress.GetSel(pos1, pos2);
     len = m_EBCaddress.GetWindowTextLength();
     line = new char[len+1];
     newline = new char[len+1];
     nbytes = m_EBCaddress.GetWindowText(line, len+1);

     // ¾Æ·¡ºÎºÐÀº Çí»ç°ª¸¸ üũÇϴµ¥
     // ÇÊ¿äÇÒ °æ¿ì Á¶°Ç¹®À» ¹Ù²Û´Ù.
     for(i = j = 0; i <= nbytes; i++) {     // null Æ÷ÇÔ
          if(isxdigit(line[i]) :: line[i] == NULL)
               newline[j++] = line[i];
     }

     if(strcmp(line, newline) != 0) {
          m_EBCaddress.SetWindowText(newline);     // ¿©±â¼­ Àç±ÍÈ£Ãâ
          if(pos1 - (i - j) >= 0) pos1 = pos1 - (i - j);
          if(pos2 - (i - j) >= 0) pos2 = pos2 - (i - j);
          m_EBCaddress.SetSel(pos1, pos2);     // hh1rr
     }

     delete line;
     delete newline;
}

Çí»ç µ¥ÀÌÅÍ ³¯¸®±â

 void CSerialDlg::OnButtonSendHexa()
{
     int i, n, c;
     CString string, temp;

     UpdateData(TRUE);

     // Çí»ç °í¸£±â
     n = m_EDsendHexa.GetLength();
     if(n == 0)
          return;
     
     for(i=0; i<n; i++) {
          c = m_EDsendHexa.GetAt(i);
          if(isxdigit(c)) {
               temp.Format("%c", c);
               string += temp;
          }
     }

     m_EDsendHexa = string;
     m_EDsendHexa.MakeUpper();
     UpdateData(FALSE);

     // sendbuf
     BYTE sendbuf[MAX_SEND_SIZE];
     int nSize;

     string = m_EDsendHexa;
     // 2 char °¡ ÇϳªÀÇ hexa °ªÀ¸·Î ³¯¾Æ°¨
     nSize = string.GetLength()/2;
     for(i=0; i<nSize; i++) {
          temp = string.Left(2);
          string = string.Right(string.GetLength()-2);
          
          sscanf(temp, "%x", &c);
          sendbuf[i] = c;
     }

     if(!m_COM.Write(sendbuf, nSize)) {
          temp.Format("%s Write Error !!", m_port);
          AddListBox(&m_LBCstatus, temp);
          return;
     }
}

<VC++¿¡¼­ ½Ã¸®¾ó Æ÷Æ®·Î µ¥ÀÌÅÍ ºñÆ® ¹ß»ý>

 ½Ã¸®¾ó Æ÷Æ®·Î µ¥ÀÌÅÍ ºñÆ®¸¦ ¹ß»ý½ÃÄÑ¾ß Çϴµ¥ ¾î¶»°Ô ÇØ¾ß ÇÏ´ÂÁö ¸ð¸£°Ú½À´Ï´Ù. ºñÁÖ¾ó C++ ÇÁ·Î±×·¥Àº óÀ½À̶ó ÀüÇô °¨ÀÌ ¾È¿É´Ï´Ù. ƯÁ¤ ÇÁ·ÎÅäÄÝÀÌ Àû¿ëµÇ´Â ºÎºÐÀ¸·Î PC¿¡¼­ ƯÁ¤Ç°(52ºñÆ®)ÀÇ ºñÆ®¸¦ ½Ã¸®¾ó ¹æ½ÄÀ¸·Î ¼øÂ÷ÀûÀ¸·Î ¹ß»ý½ÃÄÑ RS-232·Î º¸³»Áà¾ß ÇÕ´Ï´Ù. ±× ´ÙÀ½À¸·Î ´Ù¸¥ ÄÁ¹öÅÍ¿¡ ÀÇÇØ µ¥ÀÌÅÍ º¯È¯ÀÌ ÀÌ·ïÁöµµ·Ï ÇÏ·Á ÇÕ´Ï´Ù. RS-232 ºñÆ® ´ÜÀ§·Î ½Ã¸®¾ó µ¥ÀÌÅ͸¦ ¹ß»ý½ÃÄÑÁÖ´Â ¹ýÀ» ¾Ë·ÁÁÖ¼¼¿ä.

 ´ÙÀ½°ú °°Àº ¼ø¼­·Î ÇÏ¸é µË´Ï´Ù.

[1] »ç¿ëÇÒ ½Ã¸®¾ó Æ÷Æ®¸¦ ¿ÀÇÂÇØÁà¾ß ÇÕ´Ï´Ù. ÀÌ´Â CreateFile() API¸¦ »ç¿ëÇÏ¸é µÇ¸ç, ÆĶó¹ÌÅÍ¿¡ °üÇÑ ¼³¸íÀº MSDNÀ» ÂüÁ¶Çϼ¼¿ä.

[2] Åë½Å ȯ°æ ¼³Á¤À» ÇØÁà¾ß ÇÕ´Ï´Ù. DCB struct¿¡ »ç¿ëµÉ ȯ°æµé(baudrate, data bit..) µîÀ» ¼³Á¤ÇØÁÖ°í SelfCommState() API¸¦ »ç¿ëÇØ À̸¦ ¼ÂÆÃÇÕ´Ï´Ù.

[3] SetCommMask() API¸¦ »ç¿ëÇØ Input ¹öÆÛ¿¡¼­ °¨ÁöÇÒ À̺¥Æ®µéÀ» ¼³Á¤ÇÕ´Ï´Ù. ±× SetupComm() API¸¦ »ç¿ëÇØ Input/Output ¹öÆÛ¸¦ ¼³Á¤ÇÏ°í, PurgeComm() API·Î À̸¦ ÃʱâÈ­ÇÕ´Ï´Ù(ÀÌ Á¤µµ¸é Åë½Å»ó ÇÊ¿äÇÑ È¯°æ ¼³Á¤Àº ´ë°­ °®Ãß¾ú´Ù°í º¼ ¼ö ÀÖ½À´Ï´Ù).

[4] ÀÌÁ¦ ÇØ¾ß ÇÒ ÀÏÀº µ¥ÀÌÅ͸¦ ¹ß»ý½ÃÅ°´Â °ÍÀÔ´Ï´Ù. ÀÌ´Â ºñ±³Àû °£´ÜÇÕ´Ï´Ù. WriteFile() API¸¦ »ç¿ëÇÏ¸é ¿ø°Ý ½Ã½ºÅÛ(Remote System)À¸·Î µ¥ÀÌÅÍ°¡ Àü¼ÛµË´Ï´Ù. À§ÀÇ ÇÔ¼ö ÆĶó¹ÌÅÍ Áß Ã¹Â° ÀÎÀÚ°¡ óÀ½¿¡ »ç¿ëÇß´ø CreateFileÀÇ ¸®ÅÏ°ª(Return Value)À¸·Î ÀÌ´Â ¿­¸° Æ÷Æ®¿¡ ´ëÇÑ Çڵ鷯Àε¥, WriteFile()Àº À̸¦ °¡Áö°í ÇØ´ç Æ÷Æ®·Î µ¥ÀÌÅ͸¦ Àü¼ÛÇÕ´Ï´Ù.
 ³ª¸ÓÁö ÆĶó¹ÌÅ͵éÀº Àü¼ÛÇÒ µ¥ÀÌÅÍ, µ¥ÀÌÅÍ ±æÀÌ µûÀ§µéÀε¥ ºñ±³Àû °£´ÜÇÕ´Ï´Ù. ¸¶Áö¸· ÀÎÀÚ°¡ Overlapped struct pointer·Î ÀÌ°ÍÀº CreateFile()·Î Æ÷Æ®¸¦ ¿ÀÇÂÇßÀ» ¶§ À̸¦ Overlapped·Î CreateÇßÀ¸¸é Æ÷Æ®¿¡ ´ëÇÑ Read/Write ½Ã ¹ß»ýÇÏ´Â À̺¥Æ®µéÀ» Overlapped°¡ °üÀåÇÏ°Ô µÇ´Âµ¥ ±×¶§ »ç¿ëÇÏ´Â Overlapped I/O struct pointer¸¦ ¸»ÇÕ´Ï´Ù. ÇÏÁö¸¸ Overlapped·Î CreateÇÏÁö ¾Ê¾ÒÀ¸¸é ¾Æ¹« »ý°¢¾øÀÌ NULLÀ» »ç¿ëÇÏ¸é µË´Ï´Ù.

 

<CtrlList¿¡¼­ Ä÷³ °íÁ¤½ÃÅ°±â>

 CtrlList¿¡¼­ Ä÷³À» °íÁ¤½ÃÅ°·Á°í Çϴµ¥ codeguru¿¡ ³ª¿Í ÀÖ´Â ´ë·Î ÇØ º¸¾ÒÁö¸¸ Àß ¾ÈµË´Ï´Ù. ¹æ¹ýÀ» ¾Ë·ÁÁÖ¼¼¿ä.

ListCtrlÀº Ä÷³ Å©±â¸¦ ¹Ù²Ù±â Àü¿¡ ÀÚ½ÅÀÇ ºÎ¸ð À©µµ¿ì¿¡°Ô ÅëÁö(notification) ¸Þ½ÃÁö¸¦ º¸³À´Ï´Ù. ±×·¡¼­ ¿ì¸®´Â ÀÌ ÅëÁö ¸Þ½ÃÁö¸¦ ¸ÕÀú ó¸®ÇÒ ¼ö ÀÖ´Â ¸Þ½ÃÁö Çڵ鷯¸¦ ¸¸µé¸é µÇÁö¿ä. ÀÌ ÅëÁö ¸Þ½ÃÁö¸¦ ó¸®Çϱâ À§Çؼ­´Â OnNotify() ÇÔ¼ö¸¦ ¿À¹ö¶óÀ̵åÇÏ¸é µË´Ï´Ù.

BOOL CTestListCtrl::OnNotify(WPARAM wParam, LPARAM lParam,
     LRESULT* pResult)
{
     switch (((NMHDR *)lParam->code) {
     case HDN_BEGINTRACKW :        // ¸¶¿ì½º Æ®·¡Å·½Ã ¹ß»ýÇÏ´Â Å뺸 ¸Þ½ÃÁö
     case HDN_BEGINTRACKA :         //
          *pResult = TRUE;                  // Ä÷³ Å©±â Á¶Àý ¹æÁö
          return TRUE;                        // ¸Þ½ÃÁö 󸮸øÇÏ°Ô ¹Ù·Î ¸®ÅÏ
     }

     return CTestListCtrl::OnNotify(wParam, lParam, pResult);
}

 ÀÌ·¸°Ô Çϸé Ä÷³ Å©±â Á¶Á¤À» ¹æÁöÇÒ ¼ö ÀÖ½À´Ï´Ù. À©µµ¿ì ÇÁ·Î±×·¡¹ÖÀº ´ëºÎºÐÀÇ ±¸Á¶°¡ ¸Þ½ÃÁö Àü´Þ¹æ½Ä ±¸Á¶À̱⠶§¹®¿¡ ¸ðµç ÄÁÆ®·ÑÀÇ ¸Þ½ÃÁöµéÀ» Àß ÆľÇÇÏ°í ÀÖÀ¸¸é ÇÁ·Î±×·¡¸Ó ¸¶À½´ë·Î À̺¥Æ®µéÀ» Á¶ÀýÇÒ ¼ö ÀÖ½À´Ï´Ù. MFC¸¦ »ç¿ëÇϸé ÀÌ ¸Þ½ÃÁöµéÀÇ È帧À» Àß ÆľÇÇϱâ Èûµì´Ï´Ù. ¿Ö³ÄÇϸéÀÌ ¸Þ½ÃÁö¿¡ ÀÀ´äÇÏ´Â ÄݹéÇÔ¼öµéÀÌ Ä¸½¶È­µÇ¾î Àֱ⠶§¹®ÀÌÁÒ. ±×·¡¼­ API¸¦ °øºÎÇϸé ÀÌ ¸Þ½ÃÁöÀÇ È帧À» ÆľÇÇϱ⠽±½À´Ï´Ù. ¾îÂ÷ÇÇ MFCµµ API¸¦ °´Ã¼ÁöÇâÀûÀ¸·Î Æ÷ÀåÇÑ Å¬·¡½ºÀ̹ǷΠ³»ºÎÀûÀ¸·Î´Â API ÇÔ¼ö¿Í µ¿ÀÏÇÕ´Ï´Ù.

 

<Åõ¸íÇÑ ºä ¸¸µé±â>

 SDI¿¡¼­ Åõ¸íÇÑ ºä¸¦ ¸¸µé¾î º¸·Á°í Çϴµ¥ Àß ¾ÈµË´Ï´Ù. ¹æ¹ýÀ» ¾Ë·ÁÁÖ¼¼¿ä.

âÀ» Åõ¸íÇÏ°Ô Çϱâ À§Çؼ­´Â

BOOL CTestView::PreCreateWindow(CREATESTRUCT& cs)
{
     cs.dwExStyle |= WS_EX_TRANSPARENT;
     . . .
}

À§¿Í °°ÀÌ À©µµ¿ìÀÇ È®À彺ŸÀÏÀ» Ãß°¡ÇÏ°í

BOOL CTestView::OnEraseBkgnd(CDC* pCD)
{
     return TRUE;
}

ÀÌ·¸°Ô º¯°æÇÏ¸é ½ÇÁ¦·Î Åõ¸íÇÑ Ã¢ÀÌ ±¸ÇöµË´Ï´Ù.

 

- the end of this article -