๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[์ž๋™์ฐจ ๋’ทํŽธ์— LCDํŒ์œผ๋กœ ์ƒํ™ฉ ์ „๋‹ฌํ•˜๊ธฐ 3] ๋ฆฌ๋ˆ…์Šค ์‹œ๋ฆฌ์–ผ ํ†ต์‹  (termios.h) ๋ณธ๋ฌธ

๐Ÿ‘ฉ‍๐Ÿ’ป IoT (Embedded)/Arduino

[์ž๋™์ฐจ ๋’ทํŽธ์— LCDํŒ์œผ๋กœ ์ƒํ™ฉ ์ „๋‹ฌํ•˜๊ธฐ 3] ๋ฆฌ๋ˆ…์Šค ์‹œ๋ฆฌ์–ผ ํ†ต์‹  (termios.h)

์ง•์ง•์•ŒํŒŒ์นด 2023. 11. 10. 12:07
728x90
๋ฐ˜์‘ํ˜•

โญ ๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์—์„œ ์‹œ๋ฆฌ์–ผ ํ†ต์‹ ํ•˜๊ธฐ

  • /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)
    • โ“ 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

 

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๊ฐ€ ์•„๋‹Œ ์‹œ์Šคํ…œ์—์„œ๋Š” ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.
728x90
๋ฐ˜์‘ํ˜•
Comments