ÇöÀç ÇÁ·Î±×·¥ »ó¿¡¼ ¿¡µðÅÍ Ã¢À¸·Î ÀԷ¹ÞÀº ¾Æ½ºÅ° µ¥ÀÌÅÍ 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 -