´ÙÀ½ ÀÌÀü Â÷·Ê

2. ½ÃÀÛÇϱâ

2.1 µð¹ö±ë

Äڵ带 µð¹ö±ëÇÏ´Â °¡Àå ÁÁÀº ¹æ¹ýÀº ¶Ç ÇϳªÀÇ ¸®´ª½º ¹Ú½º¸¦ ¼Â¾÷ÇÏ°í µÎ ¸®´ª½º ¹Ú½º¸¦ null-modem ÄÉÀ̺í·Î ¿¬°áÇÏ´Â °ÍÀÌ´Ù. Miniterm ÇÁ·Î±×·¥À» ÀÌ¿ëÇÏ¿© ¹®ÀÚµéÀ» Àü¼ÛÇغ¸¶ó. MinitermÀº ÄÄÆÄÀÏÇϱ⵵ ½±°í, Å°º¸µå¿¡¼­ ÀԷµǴ ¹®ÀÚµé(Ư¼ö¹®ÀÚ Æ÷ÇÔ)À» ½Ã¸®¾ó Æ÷Æ®·Î Àü¼ÛÇÒ ¼ö ÀÖ´Ù. ÄÄÆÄÀÏÇÒ ¶§ üũÇØ¾ß ÇÒ °ÍÀº

#define MODEMDEVICE "/dev/ttyS0"

¹®ÀåÀÌ Á¦´ë·Î ¼³Á¤µÇ¾î Àִ°¡ ÇÏ´Â °ÍÀÌ´Ù. COM1À¸·Î ¸ÂÃß·Á¸é /dev/ttyS0, COM2·Î ÇÏ·Á¸é /dev/ttyS1À¸·Î ¼öÁ¤ÇÑ´Ù. Å×½ºÆÃÀ» ÇÒ ¶§ °¡Àå Áß¿äÇÑ °ÍÀº ¹®ÀÚ°¡ ½Ã¸®¾ó Æ÷Æ®·Î Ãâ·ÂµÉ ¶§ µ¥ÀÌÅÍ°¡ Ãâ·Â µ¥ÀÌÅÍ Ã³¸®(output processing)À» ÇÏÁö ¾Ê°í ±×´ë·Î(raw) Àü¼ÛÀÌ µÇ´Â°¡¸¦ È®ÀÎÇÏ´Â °ÍÀÌ´Ù. Å×½ºÆ® °úÁ¤Àº ´ÙÀ½°ú °°´Ù. µÎ ´ëÀÇ ¸®´ª½º ¹Ú½º¿¡¼­ °¢°¢ miniterm ÇÁ·Î±×·¥À» ½ÇÇà½ÃÅ°°í Å°º¸µå¸¦ Ãĺ»´Ù. ÇÑ °÷¿¡¼­ ŸÀÌÇÎÇÑ ¹®ÀÚ°¡ ´Ù¸¥ °÷¿¡¼­ ±×´ë·Î ³ªÅ¸³ª´Â Áö È®ÀÎÇÑ´Ù.

Null-modem ÄÉÀ̺íÀÇ TxD¿Í RxD°¡ ¼­·Î cross ¿¬°áÀÌ µÇ¾î¾ß ÇÑ´Ù. Àß ¸ð¸£°ÚÀ¸¸é Serial-HOWTO ¹®¼­ÀÇ 7ÀåÀ» º»´Ù.

À§ÀÇ Å×½ºÆ®´Â ÇÑ ´ëÀÇ ÄÄÇ»Å͸¸ °®°íµµ °¡´ÉÇÏ´Ù. »ç¿ëÇÒ ¼ö ÀÖ´Â ½Ã¸®¾ó Æ÷Æ®°¡ µÎ °³ ÀÖ´Ù¸é ÄÉÀ̺íÀ» °¢°¢ÀÇ ½Ã¸®¾ó Æ÷Æ®¿¡ ¿¬°áÇÏ°í minitermÀ» µÎ °³ ½ÇÇàÇÏ¿© Å×½ºÆ®ÇÏ¸é µÈ´Ù.

2.2 Æ÷Æ® ¼¼ÆÃ

ÀåÄ¡ ÆÄÀÏÀÎ /dev/ttyS*´Â ¸®´ª½º¿¡¼­ Å͹̳ÎÀ» ¿¬°áÇϱâ À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëµÈ´Ù. ÀÌ »ç½ÇÀº ½Ã¸®¾ó Åë½Å ÇÁ·Î±×·¡¹ÖÀ» Çϴµ¥ ¹Ýµå½Ã ±â¾ïÇØ¾ß ÇÒ »çÇ×ÀÌ´Ù. ¿¹¸¦ µé¾î, ½Ã¸®¾ó Æ÷Æ®µµ ¹®ÀÚ ¿¡ÄÚ¸¦ Çϵµ·Ï ¼³Á¤µÇ¾î ÀÖ´Ù. ÀÌ ¼³Á¤Àº º¸Åë µ¥ÀÌÅÍ Àü¼Û½Ã¿¡ ¹Ù²ã¾ß ÇÒ »çÇ×ÀÌ´Ù. (¿ªÀÚ ÁÖ: ½Ã¸®¾ó ÀåÄ¡ ÆÄÀϵµ Å͹̳ΠÀåÄ¡·Î ºÐ·ùµÇ±â ¶§¹®¿¡ Ãʱ⠼³Á¤Àº ÀÏ¹Ý Å͹̳ο¡¼­ »ç¿ëµÇ´Â ¿¡ÄÚ°¡ µÇµµ·Ï ¼³Á¤µÇ¾î ÀÖ´Â °ÍÀÌ´Ù.)

¸ðµç ÆĶó¹ÌÅ͵éÀº ÇÁ·Î±×·¥ Äڵ忡¼­ ½±°Ô ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ÆĶó¹ÌÅ͵éÀº <asm/termbits.h>¿¡ Á¤ÀǵǾî ÀÖ´Â struct termios ±¸Á¶Ã¼¿¡ ÀúÀåµÇ¾î ÀÖ´Ù.

       #define NCCS 19
       struct termios {
               tcflag_t c_iflag;               /* input mode flags */
               tcflag_t c_oflag;               /* output mode flags */
               tcflag_t c_cflag;               /* control mode flags */
               tcflag_t c_lflag;               /* local mode flags */
               cc_t c_line;                    /* line discipline */
               cc_t c_cc[NCCS];                /* control characters */
       };

ÀÌ ÆÄÀÏÀº ¸ðµç flagµéÀ» Á¤ÀÇÇÏ°í ÀÖ´Ù. c_iflag(ÀÔ·Â ¸ðµå flag)´Â ¸ðµç ÀԷ ó¸®(input processing)¸¦ Á¤ÀÇÇÑ´Ù. ÀԷ ó¸®¶õ read() ÇÔ¼ö¿¡ ÀÇÇØ ½Ã¸®¾ó Æ÷Æ®·Î µé¾î¿Â µ¥ÀÌÅ͸¦ read¿¡ ÀÇÇØ Àбâ Àü¿¡ µ¥ÀÌÅ͵éÀ» c_iflag¿¡ Á¤ÀÇÇÑ ´ë·Î ó¸®ÇÏ´Â °ÍÀ» ÀǸ¶ÇÑ´Ù. c_oflag(Ãâ·Â ¸ðµå flag)´Â Ãâ·Â ó¸®(output processing) ÇÏ´Â ¹æ¹ýÀ» Á¤ÀÇÇÑ´Ù. c_cflag(Á¦¾î ¸ðµå flag)´Â baudrate, data bits, stop bits µîÀÇ Æ÷Æ® ¼¼ÆÃÀ» Á¤ÀÇÇÑ´Ù. c_lflag(local ¸ðµå flag)´Â echo¸¦ ÇÒ °ÍÀÎÁö µîÀ» °áÁ¤ÇÑ´Ù. ¸¶Áö¸·À¸·Î c_cc(Á¦¾î ¹®ÀÚ) ¹è¿­Àº EOF(End of File), STOP µîÀÇ Á¦¾î µ¿ÀÛµéÀ» ¾î¶² ¹®ÀÚ·Î Á¤ÀÇÇÒ °ÍÀΰ¡¸¦ ¼³Á¤ÇÑ´Ù. Á¦¾î ¹®ÀÚÀÇ µðÆúÆ® ¹®ÀÚ´Â <asm/termios.h>¿¡ Á¤ÀǵǾî ÀÖ´Ù. À§ flagµé¿¡ °üÇÑ ¼³¸íÀº termios(3) man page¿¡ ³ª¿ÍÀÖ´Ù. termios ±¸Á¶Ã¼ÀÇ c_line Ç׸ñÀº POSIX ȣȯ ½Ã½ºÅÛ¿¡¼­ »ç¿ëµÇÁö ¾Ê´Â´Ù.

2.3 ½Ã¸®¾ó ÀåÄ¡ÀÇ ÀÔ·Â ¹æ¹ý

ÀÌ ¼½¼Ç¿¡¼­´Â ¼¼ °¡ÁöÀÇ ÀÔ·Â ¹æ¹ýÀ» ±â¼úÇϱâ·Î ÇÑ´Ù. ÀÀ¿ë ºÐ¾ß¿¡ µû¶ó¼­ ¾Ë¸ÂÀº ¹æ¹ýÀ» »ç¿ëÇØ¾ß ÇÑ´Ù. ÇÑ ¹®ÀÚ¾¿ Àд ·çÇÁ¸¦ µ¹·Á¼­ Àüü ¹®ÀÚ¿­À» ¹Þ´Â ¹æ¹ýÀº °¡´ÉÇÏ´Ù¸é ÇÇÇØ¾ß ÇÑ´Ù. ³»°¡ ÀÌ·± ¹æ¹ýÀ¸·Î ÇßÀ» ¶§, ¹®ÀÚ¸¦ ÀÒ¾î¹ö¸®´Â °æ¿ì°¡ »ý±ä ¹Ý¸é, Àüü ¹®ÀÚ¿­À» Çѹø¿¡ ÀÐÀ» ¶§´Â ¿¡·¯°¡ ¹ß»ýÇÏÁö ¾Ê¾Ò´Ù.

Canonical ÀԷ ó¸®(Canonical Input Processing)

Canonical ÀԷ ó¸®´Â Å͹̳ÎÀÇ ±âº» ó¸® ¹æ¹ýÀÌ´Ù. ÀÌ ¹æ¹ýÀº ÇÑ ÁÙ ´ÜÀ§·Î ó¸®ÇÏ´Â ´Ù¸¥ ÇÁ·Î±×·¥°ú Åë½ÅÇϴµ¥¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÇÑ ÁÙÀº µðÆúÆ®·Î NL(New Line, ASCII´Â LF) ¹®ÀÚ, EOF(End of File) ¹®ÀÚ, ȤÀº EOL(End of Line)¿¡ ÀÇÇØ Á¾·áµÇ´Â ¹®ÀÚ¿­À» ÀǹÌÇÑ´Ù. CR(Carriage Return, DOS/WindowsÀÇ µðÆúÆ® EOL ¹®ÀÚÀÓ) ¹®ÀÚ´Â µðÆúÆ® ¼¼Æÿ¡¼­ ÇÑ ÁÙÀÇ Á¾·á ¹®ÀÚ·Î ÀνĵÇÁö ¾Ê´Â´Ù.

¶ÇÇÑ Canonical ÀԷ ó¸® ¸ðµå¿¡¼­´Â ERASE, DELETE WORD, REPRINT CHARACTERS ¹®ÀÚµéÀ» ó¸®ÇÒ ¼ö ÀÖ°í, CR ¹®ÀÚ¸¦ NL ¹®ÀÚ·Î º¯È¯ 󸮸¦ ÇÒ ¼ö ÀÖ´Ù.

Non-Canonical ÀԷ ó¸®(Non-Canonical Input Processing)

Non-Canonical ÀԷ ó¸® ¸ðµå¿¡¼­´Â ÇÑ ¹ø ÀÐÀ» ¶§¸¶´Ù Á¤ÇØÁø Å©±âÀÇ ¹®ÀÚ¸¸À» Àо ¼ö ÀÖ´Ù. ¶ÇÇÑ Å¸À̸Ӹ¦ µÎ¾î¼­ ÀÏÁ¤ ½Ã°£±îÁö read()°¡ ¸®ÅÏÇÏÁö ¾Ê´Â °æ¿ì °­Á¦ ¸®ÅÏÀ» ÇÒ ¼ö ÀÖ´Ù. ÀÌ ¸ðµå´Â Ç×»ó Á¤ÇØÁø Å©±âÀÇ ¹®Àڵ鸸À» Àо°Å³ª ´ë·®ÀÇ ¹®ÀÚµéÀ» Àü¼ÛÇÏ°íÀÚ ÇÒ ¶§ »ç¿ëÇÑ´Ù.

ºñµ¿±â ÀÔ·Â

À§¿¡¼­ ¼³¸íÇÑ µÎ °¡Áö ¸ðµå´Â µ¿±â ¹æ½ÄÀ̳ª ºñµ¿±â ¹æ½ÄÀ¸·Î »ç¿ëµÉ ¼ö ÀÖ´Ù. µ¿±â ¹æ½ÄÀº readÀÇ Á¶°ÇÀÌ ¸¸Á·µÉ ¶§±îÁö blockµÇ´Â ¹æ½ÄÀ¸·Î¼­ µðÆúÆ®·Î ¼³Á¤µÇ¾î ÀÖ´Ù. ºñµ¿±â ¹æ½Ä¿¡¼­´Â read() ÇÔ¼ö°¡ ¹Ù·Î ¸®ÅϵǸç, È£ÃâÇÑ ÇÁ·Î±×·¥¿¡°Ô signalÀ» º¸³½´Ù. ÀÌ signalÀº signal handler(½Ã±×³Î ó¸® ÇÔ¼ö)·Î º¸³»Áø´Ù.

ÀÔ·ÂÀåÄ¡ ¸ÖƼÇ÷º½Ì

À§¿¡¼­ ¼³¸íÇÑ ÀÔ·Â ¸ðµå¿¡ ÇØ´çÇÏÁø ¾ÊÁö¸¸ ¿©·¯ °³ÀÇ ÀåÄ¡µéÀ» ´Ù·ç°íÀÚ ÇÒ ¶§ À¯¿ëÇÏ´Ù. ¿¹¸¦ µé¾î ³» ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­ TCP/IP ¼ÒÄÏ°ú ½Ã¸®¾ó Åë½Å¿¡¼­ µ¿½Ã¿¡ ÀÔ·ÂÀ» ¹Þ¾Æ¾ß Çß´Ù. ¾Æ·¡ 3.4ÀÇ ¿¹Á¦´Â µÎ °³ÀÇ ¼­·Î ´Ù¸¥ ÀåÄ¡·ÎºÎÅÍ µ¿½Ã¿¡ ÀÔ·ÂÀ» ±â´Ù¸®´Â ÄÚµåÀÌ´Ù. µÑ Áß ÇÑ °³ÀÇ ÀåÄ¡¿¡¼­ ÀÔ·ÂÀÌ µé¾î¿À¸é 󸮸¦ ÇÏ°í ¶Ç ´Ù½Ã »õ·Î¿î ÀÔ·ÂÀÌ ¿Ã ¶§±îÁö ±â´Ù¸°´Ù.

¾Æ·¡ 3.4ÀÇ ¿¹Á¦´Â º¹ÀâÇØ º¸ÀÏ ¼ö ÀÖÁö¸¸, ¸®´ª½º°¡ multi-processing OSÀÓÀ» ¾Ë°í Àֱ⿡ ¸Å¿ì Áß¿äÇÏ´Ù. select() ½Ã½ºÅÛ È£Ãâ ÇÔ¼ö´Â ÀÔ·ÂÀ» ±â´Ù¸®´Â µ¿¾È CPU¿¡ ºÎÇϸ¦ ÁÖÁö ¾Ê´Â´Ù. ¹Ý¸é ÀÔ·ÂÀÌ µé¾î¿Ô´ÂÁö ·çÇÁ¸¦ µ¹¸é¼­ üũÇÏ´Â polling ¹æ½ÄÀº ½Ã½ºÅÛ¿¡ ºÎÇϸ¦ ÁÖ°Ô µÇ¾î ´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ ¼öÇà ¼Óµµ¸¦ ÀúÇϽÃÅ°°Ô µÈ´Ù.


´ÙÀ½ ÀÌÀü Â÷·Ê