[์๋์ฐจ ๋ทํธ์ LCDํ์ผ๋ก ์ํฉ ์ ๋ฌํ๊ธฐ 3] ๋ฆฌ๋ ์ค ์๋ฆฌ์ผ ํต์ (termios.h)
โญ ๋ฆฌ๋ ์ค ํ๊ฒฝ์์ ์๋ฆฌ์ผ ํต์ ํ๊ธฐ
- /dev/tty~ ๋ผ๋ ์ด๋ฆ์ ์ฅ์น๋ฅผ ์ ์์ค ํจ์๋ก ์ ์ด
- ์ค์ ์ฅ์น๊ฐ ์์ผ๋ฉด ์ปดํจํฐ์ ๊ฐ์ ํฌํธ๋ฅผ ์ค์นํ๋ฉด ๋๋ค
- ๋ฆฌ๋ ์ค์ c(์บ๋ฆญํฐ ์ฅ์น{1๋ฐ์ดํธ์ฉ ํต์ ๋ชฉ์ })์ธ tty~๊ฐ ํ์ผํํ๋ก ์์ฑ
โญ struct termios
- ์๋ฆฌ์ผ ํฌํธ์ ์
์ถ๋ ฅ์ ์ค์ ํ๋ ๊ตฌ์กฐ์ฒด
- ์์ผ ๋คํธ์ํฌ์์ ๋คํธ์ํฌ ์ ๋ณด๋ฅผ ์ค์ ํ๋ ๋ฐฉ์๊ณผ ๋น์ทํ๊ฒ ์ฌ์ฉ๋จ
- POSIX๊ฐ ์ง์ ํ ํ์ค ์ธํฐํ์ด์ค
- ์ด์์ฒด์ ํ์ค์์ ๋ง์กฑํ๋ค
- ๊ตฌ์กฐ์ฒด ํญ๋ชฉ
- c_iflag: ํฐ๋ฏธ๋ ์ ๋ ฅ์ ๋ํด ์ค์
- c_oflag: ํฐ๋ฏธ๋ ์ถ๋ ฅ์ ๋ํด ์ค์
- c_cflag: ํฐ๋ฏธ๋ ์ ์ด์ ๋ํด ์ค์ (๋ฐ์ดํฐ ๋นํธ, ํจ๋ฆฌํฐ ๋ฑ)
โญ ์๋ฆฌ์ผ ํต์ ๋ฐฉ์
1) canonical
์ํฐ์ ๋ ฅ ๋๊ธฐ (ํฐ๋ฏธ๋ ์ ๋ ฅ์ ์์ค๋ฌธ์('\n'), EOF(End of file), ๋๋ EOL ๋ฌธ์๋ค๋ก ์ข ๋ฃ๋๋ ํ ๋ผ์ธ์ผ๋ก ์ฒ๋ฆฌ ๋๋ค.)
- EOF : ํฐ๋ฏธ๋์์ ์ ๋ ฅ์ ๋ฐ์ ๋,Windows์์๋ "Ctrl+Z"ํคLinux์์๋ "Ctrl+D"ํค๋ฅผ ์ ๋ ฅ๋ฐ์ ๋ EOF๋ฅผ ๋ฐํํ๋ค.
- End Of Line, New Line
2) non-canonical
์๊ฐ/๊ฐ์์ ํ
๋น์ ๊ท์ ๋ ฅ์์(NonCanonical) ์ฝํ์ง ๋ฐ์ดํธ๋ค์ MIN๊ณผ TIME์ ์ค์ ํจ์ผ๋ก ์ธํด์ ์ ์ด ๋๋ค.
๋ฌธ์๋ค์ ๋ผ์ธ๋ค๋ก ๋ฌถ์ฌ์ง์ง ์๊ณ , ERASE์ KILL ํ๋ก์ธ์ฑ์ ์ํ๋์ง ์๋๋ค.
VMIN๊ณผ VTIME์ ์ค์ ํ๋ ๊ฒ์ผ๋ก ๋ณด์, non-canonical๋ชจ๋์ธ ๊ฒ ๊ฐ๋ค.
3) asynchronous
SW ์ธํฐ๋ฝํธ
4) multi flexing
select() ์ฌ์ฉ
Canonical : ํฐ๋ฏธ๋์ ๊ธฐ๋ณธ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ด๋ฉฐ ํ ์ค ๋จ์๋ก ํต์ ์ ํ๋ค.
ํ ์ค์ด๋ ์๋ฏธ๋ New Line, End Of File, End Of Line์ผ๋ก ๊ตฌ๋ถ์ด ๋๋ค.
Non-Canonical : ํ ๋ฒ์ ์ ํด์ง ํฌ๊ธฐ์ ๋ฐ์ดํฐ๋ง ์ฝ์ด ๋ค์ธ๋ค.
ํ์ด๋จธ์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
Asynchronous : read์ ์กฐ๊ฑด์ด ๋ง์กฑ๋ ๋๊น์ง Blocking ๋๋ ๋ฐฉ์์ด๋ค.
ํธ์ถํ ํ๋ก๊ทธ๋จ์๊ฒ Signal์ ์ ์กํ๋ค.
์ ์ก๋ Signal์ Signal Handler๋ก ์ฒ๋ฆฌ๊ฐ ๋๋ค.
Multi Flexing : ์ฌ๋ฌ ๊ฐ์ ์ฅ์น๋ค์ ๋ค๋ฃจ๊ณ ์ ํ ๋ ์ ์ฉํ๋ค.
Select() ์ฌ์ฉ๋ฐฉ์๊ณผ ๊ฐ๋ค.
=> ์๋์ฐ์ ๊ฐ์ ์๋ฆฌ์ผ ํฌํธ๋ฅผ ๋ง๋ค์ด ๊ฐ์ ๋จธ์ /ํ์ดํผํฐ๋ฏธ๋๊ณผ ์ฐ๊ฒฐํด PC ๋ด๋ถ์์ ์๋ฆฌ์ผ ํต์ ํ ์ ์๋๋ก ์ค์
โญ Termios.h
1) open
int open(const char *pathname, int flags, mode_t mode);
- ๋ฌธ์์ด๋ก ์ ์ธ๋ ๊ฒฝ๋ก(pathname)๋ฅผ ๋ฐ์์ ํ์ผ ๋์คํฌ๋ฆฝํฐ(fd)๋ก ๋ฐํํ๋ ํจ์
- ์ก์ธ์ค ๋ชจ๋๋ ์ฝ๊ธฐ(์์ )๋ง ํ ๊ฑด์ง ์ฐ๊ธฐ๋ง ํ ๊ฑด์ง(์ก์ ) ๋ชจ๋ ํ ๊ฑด์ง๋ฅผ ๊ฒฐ์ Flag Description
Flag Description O_RDONLY ์ฝ๊ธฐ๋ง O_WRONLY ์ฐ๊ธฐ๋ง O_RDWR ์ฝ๊ธฐ/์ฐ๊ธฐ ๋ชจ๋ O_NOCTTY ์ ์ด ์ ํ ์ด๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ํค๋ณด๋ ์ค๋จ ์ ํธ (Ctrl + C) ๋ฑ์ ์ํฅ์ ๋ฐ์ O_NDELAY ์์ ๋๊ธฐ ์ฐจ๋จ read() ์ ์์ ๋ ๋ฐ์ดํฐ ์์ผ๋ฉด ๋ฐ๋ก ๋ฐํ
- flag
tcflag_t c_iflag ์ ๋ ฅ ๋ชจ๋ (input) tcflag_t c_oflag ์ถ๋ ฅ ๋ชจ๋ (output) tcflag_t c_cflag ์ ์ด ๋ชจ๋ (control) tcflag_t c_lflag ๋ก์ปฌ ๋ชจ๋ (local) cc_t c_cc [VTIME] Time out ์ค์ cc_t c_cc [VMIN] ์ต์ ๋ฐํ Character ์ - โ c_cflag ์ ์ด๋ชจ๋
- Baudrate
- ์๋ฆฌ์ผ ํต์ ์๋ : ๋จ์๋ "bps(bit per second)"
- 1์ด์ ์ผ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์๋๋
- 7๋นํธ ์ซ์๊ฐ ๋๊ฒจ์ง
- StopBits
- CSTOPB : Stop bit ์ 2๊ฐ [newtio.c_cflag|= CSTOPB]
- ~CSTOPB : Stop bit ์ 1๊ฐ [newtio.c_cflag&= ~CSTOPB]
- DataBits
- CSIZE : ๋ฌธ์ ํฌ๊ธฐ ๋ง์คํฌ
- CS5 , CS6 , CS7, CS8
- 7๋นํธ ์ซ์
- ํจ๋ฆฌํฐ ๋นํธ(Parity Bit)
- IGNPAR : ํ๋ ์ ์ค๋ฅ ๋ฐ ํจ๋ฆฌํฐ ์ค๋ฅ๋ฅผ ๋ฌด์ (ignore parity)
- PARENB : ์ถ๋ ฅ ์ ํจ๋ฆฌํฐ ์์ฑ์ ํ์ฑํํ๊ณ ์ ๋ ฅ (parity ENB)
- PARODD : ์ค์ ๋๋ฉด ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ์ ํจ๋ฆฌํฐ๊ฐ ํ์, ๋ฐ์ ๋๋ฉด ํจ๋ฆฌํฐ๊ฐ ์ง์ [~PARODD] (parity odd)
- Others
- CRTSCTS : RTS / CTS (ํ๋์จ์ด) ํ๋ฆ ์ ์ด๋ฅผ ํ์ฑํ (C RTS CTS)
- CLOCAL : ๋ชจ๋ ์ ์ด ๋ผ์ธ ๋ฌด์(Carrier Detect ์ ํธ) (C LOCAL)
- CREAD : ์์ ํ์ฑํ. (C READ)
- Baudrate
- โ c_iflag : ์
๋ ฅ ๋ชจ๋
- ์๋ฆฌ์ผ ํฌํธ์ ์์ ๋๋ ๋ฐ์ดํฐ์ ๋ํ ์ฒ๋ฆฌ
- INPCK : ์ ๋ ฅ ํจ๋ฆฌํฐ ๊ฒ์ฌ๊ฐ ํ์ฑํ (IN Parity Check)
- IGNPAR : ํจ๋ฆฌํฐ ์ค๋ฅ๊ฐ ์๋ ๋ชจ๋ ๋ฐ์ดํธ๊ฐ ๋ฌด์ (ingnore Parity)
- PARMRK : ํจ๋ฆฌํฐ ์ค๋ฅ๊ฐ์๋ ์ ๋ ฅ ๋ฐ์ดํธ๊ฐ ํ์ (parity mark)
- ISTRIP : ์ ํจํ ์ ๋ ฅ ๋ฐ์ดํธ๊ฐ 7 ๋นํธ๋ก ์ ๊ฑฐ
- โ c_cc [VTIME] / c_cc [VMIN]
- VMIN : ์ต์ ์ผ๋ง์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์์ ๋ ์ฝ์ด์ฌ์งFlag Description ์ ๋ ฅ์ด ์๋ ๊ฒฝ์ฐ ๋ฐํ ๊ฐ๋ฅ ์ฌ
- VTIME : ๋ฐ์ดํฐ ์์ ๋๊ธฐ ์๊ฐ. [read() ์ผ๋ง๋ ๊ธฐ๋ค๋ฆฌ๊ณ ์์์ง]
-
VMIN = 0 , VTIME = 0 ๋ค์ด์จ๋ฐ์ดํฐ๊ฐ ์์ด๋ ์ฆ์๋ฐํ [์์ ๋ ๋ฐ์ดํฐ ๊ธธ์ด 0 ๋ฐํ๊ฐ๋ฅ] O VMIN = 0 and VTIME > 0 VTIME์ ๋ํ ์๊ฐ์ด ์ง๋๋ฉด ์ ๋ ฅ๋ฐ์ดํฐ๊ฐ ์์ด๋ ๋ฐํ[์์ ๋ ๋ฐ์ดํฐ ๊ธธ์ด 0 ๋ฐํ ๊ฐ๋ฅ] O VMIN > 0 and VTIME = 0 ์์ ๋ ๋ฌธ์ ์๊ฐ VMIN ์ด์์ผ๋ ๋ฐํ๋ฉ๋๋ค. [์์ ๋ ๋ฐ์ดํฐ ๊ธธ์ด 0์ ๋ฐํํ์ง ์์ต๋๋ค.] X VMIN > 0 and VTIME > 0 VTIME์ ๋ํ ์๊ฐ์ด ์ง๋ฌ๊ฑฐ๋ (or) ์์ ๋ ๋ฌธ์ ์๊ฐ VMIN ์ด์์ผ๋ X
- โ c_cflag ์ ์ด๋ชจ๋
2) tcflush (Terminer Control Flush)
์๋ฆฌ์ผ ํฌํธ ์ด๊ธฐํ
tcflush( ttyfd, TCIFLUSH );
TCIFLUSH | Flushes/Discards received data, but not read. (Terminer Control I Flush) |
TCOFLUSH | Flushes/Discards written data, but not transmitted. (Terminer Control O Flush) |
TCIOFLUSH | Flushes/Discards both.(Terminer Control IO Flush) |
Serial Port Programming: tcflush – TCIFLUSH,TCOFLUSH example – The Geek Diary
3) tcgetattr
ํฐ๋ฏธ๋ ์ฅ์น ๋ฒํธ, ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๊ตฌ์กฐ์ฒด
-
// Terminer Control ๋ชจ๋ ์ค์ ์ ์ํด์ Get tcgetattr(port->fd, &options);
4) tcsetattr
์๋ฆฌ์ผ ํฌํธ์ ์ค์ ์ ๋ ฅ
-
tcsetattr( port->fd, TCSANOW, &options ); // ์๋ฆฌ์ผ ํฌํธ์ ์ค์ ์ ๋ ฅ
TCSANOW
์ฆ์ ์์ฑ์ ๋ณ๊ฒฝ์์ผ๋ผ. (Terminer Control SA NOW)
TCSADRAIN
ํ์ ์ ์ฅ๋ ์ถ๋ ฅ์ด ์ฐ์ฌ์ง ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ํ์ ์์ฑ์ ๋ณ๊ฒฝํ๋ผ (Terminer Control SA DRAIN)
TCSAFLUSH
TCSADRAIN๊ณผ ๊ฐ์ง๋ง, ํ์ ์ ์ฅ๋ ์ ๋ ฅ์ ๋ฒ๋ฆฐ๋ค(Terminer Control SA FLUSH)
TCASASOFT ์ด๋ค ๊ฒ๊ณผ๋ ๋ง๋ถ์ฌ ์ฌ์ฉํ ์ ์๋ ํ๋๊ทธ ๋นํธ์ด๋ค. ์ด๊ฒ์ ํ๋์จ์ด์ ๋ํ ์ํฉ์ ๋ณ๊ฒฝ์ ๊ธ์งํ๊ธฐ ์ํ ๊ฒ์ด๋ค. ์ด๊ฒ์ BSD ํ์ฅ์ด๋ค. BSD๊ฐ ์๋ ์์คํ ์์๋ ์๋ฌด๋ฐ ์ํฅ์ ๋ฐ์ง ์๋๋ค.