Sophie

Sophie

distrib > Mandriva > 9.1 > ppc > by-pkgid > cdf3204072325f4a06a79f420e013079 > files > 102

howto-text-ja-9.0-1mdk.noarch.rpm

  The Linux Serial Programming HOWTO
  by Peter H. Baumann, Peter.Baumann@dlr.de
  v1.0, 22 January 1998
  “¡Œ´‹P‰Ã, fujiwara@linux.or.jp
  26 February 1998

  ‚±‚Ì•¶‘‚ł́CLinux ƒ}ƒVƒ“‚̃VƒŠƒAƒ‹ƒ|[ƒg‚ðŽg‚Á‚½’ʐMƒvƒƒOƒ‰ƒ€‚̏‘‚«
  •û‚ðà–¾‚µ‚Ü‚·D
  ______________________________________________________________________

  –ÚŽŸ

  1. ‚Í‚¶‚ß‚É
     1.1 ’˜ìŒ ‚ɂ‚¢‚Ä
     1.2 –{•¶‘‚̍ŐV”Å‚Ì“üŽè•û–@
     1.3 ƒtƒB[ƒhƒoƒbƒN

  2. ‚Í‚¶‚ß‚Ä‚Ý‚Ü‚µ‚傤
     2.1 ƒfƒoƒbƒO‚Ì•û–@
     2.2 ƒ|[ƒg‚̐ݒè
     2.3 ƒVƒŠƒAƒ‹ƒfƒoƒCƒX‚É‚¨‚¯‚é“ü—Í‚ÌŠT”O
        2.3.1 ƒJƒmƒjƒJƒ‹“ü—͏ˆ—
        2.3.2 ”ñƒJƒmƒjƒJƒ‹“ü—͏ˆ—
        2.3.3 ”ñ“¯Šú“ü—Í
        2.3.4 •¡”“ü—Í‚©‚ç‚Ì“ü—Í‘Ò‚¿

  3. ƒvƒƒOƒ‰ƒ€—á
     3.1 ƒJƒmƒjƒJƒ‹“ü—͏ˆ—
     3.2 ”ñƒJƒmƒjƒJƒ‹“ü—͏ˆ—
     3.3 ”ñ“¯Šú“ü—Í
     3.4 •¡”‚Ì“ü—Í‚©‚ç‚Ì“ü—Í‘Ò‚¿

  4. ‘¼‚̏î•ñŒ¹
  5. ƒRƒ“ƒgƒŠƒrƒ…[ƒVƒ‡ƒ“

  ______________________________________________________________________

  1.  ‚Í‚¶‚ß‚É

  –{•¶‘‚Í Linux Serial Programming HOWTO ‚Å‚·DLinux ‚̃VƒŠƒAƒ‹ƒ|[ƒg‚ð
  Žg‚Á‚āC‘¼‚̃fƒoƒCƒX/ƒRƒ“ƒsƒ…[ƒ^‚ƒʐM‚·‚éƒvƒƒOƒ‰ƒ€‚̏‘‚«•û‚ð‰ðà‚µ
  ‚Ü‚·DƒJƒmƒjƒJƒ‹ I/O(s’PˆÊ‚Å‚Ì‘—ŽóM)C”ñ“¯Šú I/OC•¡”ƒ\[ƒX‚©‚ç‚Ì“ü
  —Í‘Ò‚¿‚́CˆÙ‚È‚éƒ^ƒCƒv‚ÌŽè–@‚ð‰ðà‚µ‚Ü‚·D

  –{•¶‘‚ł́CƒVƒŠƒAƒ‹ƒ|[ƒg‚̐ݒè•û–@‚Íà–¾‚µ‚Ü‚¹‚ñD‚±‚¿‚ç‚ɂ‚¢‚ẮC
  Greg Hankins Ž‚̏‘‚©‚ꂽ Serial-HOWTO ‚ð‚²——‚­‚¾‚³‚¢D

  Ž„‚̓VƒŠƒAƒ‹’ʐM‚Ì•ª–ì‚̐ê–å‰Æ‚Å‚Í‚ ‚è‚Ü‚¹‚ñ‚ªCƒVƒŠƒAƒ‹’ʐM‚ÉŠÖ‚í‚éƒv
  ƒƒWƒFƒNƒg‚Å–â‘è‚ð‰ðŒˆ‚µ‚Ä‚«‚Ü‚µ‚½D–{•¶‘‚ŏЉ‚éƒTƒ“ƒvƒ‹ƒR[ƒh‚́C
  LDP ƒvƒƒOƒ‰ƒ}[ƒYƒKƒCƒh
  (ftp://sunsite.unc.edu/pub/Linux/docs/LDP/programmers-
  guide/lpg-0.4.tar.gz ‹y‚у~ƒ‰[ƒTƒCƒg)‚Ì 'examples' ƒfƒBƒŒƒNƒgƒŠ‚©‚ç“ü
  Žè‚·‚邱‚Æ‚ª‚Å‚«‚é miniterm ‚É—R—ˆ‚·‚é‚à‚Ì‚Å‚·D

  1997”N‚Ì6ŒŽ‚É‚±‚Ì•¶‘‚ð‘‚¢‚Ä‚©‚çCŽ„‚͌ڋq‚Ì“s‡‚É‚æ‚è WindowsNT ‚ðŽg
  ‚¤‚悤‚É‚È‚èCŠÖ˜A’mŽ¯‚ð[‚߂邱‚Æ‚ª‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½D–{•¶‘‚É”½‰f‚³‚¹
  ‚Ü‚·‚̂ŁCƒRƒƒ“ƒg‚ª‚ ‚ê‚ΐ¥”ñ‘—‚Á‚Ä‚­‚¾‚³‚¢(ƒtƒB[ƒhƒoƒbƒN‚̏͂ðŽQ
  Æ)DŽdŽ–‚ðˆø‚«Œp‚¢‚Å‚æ‚è‚æ‚¢‚à‚Ì‚É‚µ‚Ä‚­‚¾‚³‚é•û‚ª‚¢‚ê‚΁Cƒ[ƒ‹‚Å’m
  ‚点‚Ä‚­‚¾‚³‚¢D

  ‘S‚Ä‚Ì—á‘è‚̃eƒXƒg‚́Ci386 ƒx[ƒX‚Ì Linux 2.0.29 ‚ōs‚¢‚Ü‚µ‚½D

  1.1.  ’˜ìŒ ‚ɂ‚¢‚Ä

  Linux Serial-Programming-HOWTO‚ÍPeter Baumann ‚Ì’˜ì•¨‚Å‚·(copyright
  (C) 1997)DLinux HOWTO •¶‘‚́C‚±‚Ì’˜ìŒ •\Ž¦‚ð‰ü•Ï‚µ‚È‚¢ŒÀ‚èC•¶‘‚Ì
  ˆê•”‚ ‚é‚¢‚Í‘S‘Ì‚ðC”CˆÓ‚Ì“dŽq“IE•¨—“IƒƒfƒBƒA‚Ö•¡»‹y‚Ñ”z•z‚·‚邱‚Æ
  ‚ª‚Å‚«‚Ü‚·D¤‹Æ“I”z•z‚Í”F‚ß‚ç‚ê‚Ä‚¨‚èC‚Ü‚½Š½Œ}‚µ‚Ä‚¢‚Ü‚·D‚µ‚©‚µC‚±
  ‚̂悤‚È”z•z‚̏ꍇ‚ɂ́C’˜ŽÒ‚ւ̘A—‚ª‚ ‚邱‚Æ‚ðŠó–]‚µ‚Ü‚·D

  –|–óC”h¶•¨CLinux HOWTO •¶‘‚ðŠÜ‚ޕҏW•¨‚Í‚±‚Ì’˜ìŒ •\Ž¦‚ɏ]‚í‚È‚¯‚ê
  ‚΂Ȃè‚Ü‚¹‚ñD‚‚܂èCHOWTO ‚©‚ç”h¶‚µ‚½¬‰Ê•¨‚ðì‚èC‚±‚ê‚ɐ§ŒÀ‚ð’ljÁ
  ‚µ‚Ä”z•z‚·‚邱‚Æ‚Í‚Å‚«‚Ü‚¹‚ñD‚½‚¾‚µCˆê’è‚ÌðŒ‚Ì‰º‚Å‚±‚Ì‹K‘¥‚É—áŠO‚ð
  ”F‚߂邱‚Æ‚ª‚Å‚«‚éê‡‚ª‚ ‚è‚Ü‚·DˆÈ‰º‚ɃAƒhƒŒƒX‚ðŽ¦‚· Linux HOWTO ‚Ì
  ¢˜b–ð‚É‘Š’k‚µ‚Ä‚­‚¾‚³‚¢D

  ŠÈ’P‚ÉŒ¾‚¦‚΁C‰äX‚Í‚±‚̏î•ñ‚ð‚Å‚«‚邾‚¯‘½‚­‚ÌŒo˜H‚ōL‚ß‚½‚¢‚ÆŽv‚Á‚Ä‚¢
  ‚Ü‚·D‚µ‚©‚µCHOWTO •¶‘‚Ì’˜ìŒ ‚Í•ÛŽ‚³‚ê‚邱‚ƂƁCHOWTO ‚ðÄ”z•z‚·‚é
  ‘S‚Ä‚Ì•û–@‚ð‚Å‚«‚ê‚Î’m‚点‚Ä‚à‚炦‚邱‚Æ‚ðŠó–]‚µ‚Ä‚¢‚Ü‚·D

  ‹^–â“_‚ª‚ ‚ê‚΁CLinux HOWTO ‚̐¢˜b–ð‚Å‚ ‚é gregh@sunsite.unc.edu Ž‚É
  “dŽqƒ[ƒ‹‚Å‘Š’k‚µ‚Ä‚­‚¾‚³‚¢D

  1.2.  –{•¶‘‚̍ŐV”Å‚Ì“üŽè•û–@

  Serial-Programming-HOWTO ‚̍ŐV”Å‚Í
  ftp://sunsite.unc.edu:/pub/Linux/docs/HOWTO/Serial-Programming-HOWTO
  ‹y‚сC‚»‚̃~ƒ‰[ƒTƒCƒg‚Å“üŽè‚Å‚«‚Ü‚·DPostScript ‚â DVI “™‚ÌŒ`Ž®‚Ì•¶‘
  ‚Íother-formatsƒfƒBƒŒƒNƒgƒŠ‚É‚ ‚è‚Ü‚·D‚Ü‚½C
  http://sunsite.unc.edu/LDP/HOWTO/Serial-Programming-HOWTO.html ‚É‚à‚ 
  ‚è‚Ü‚·‚µCŒŽ‚Ɉê“xcomp.os.linux.answersƒjƒ…[ƒXƒOƒ‹[ƒv‚É‚à“Še‚³‚ê‚Ü
  ‚·D

  1.3.  ƒtƒB[ƒhƒoƒbƒN

  ’ù³CŽ¿–âCƒRƒƒ“ƒgC’ñˆÄC’ljÁŽ–€‚È‚Ç‚ª‚ ‚ê‚΁C¥”ñ•MŽÒ‚É‚¨’m‚点‚­
  ‚¾‚³‚¢D‚±‚Ì•¶‘‚ð‚æ‚è—Ç‚¢‚à‚Ì‚É‚µ‚½‚¢‚ÆŽv‚Á‚Ä‚¢‚Ü‚·D‚æ‚­•ª‚©‚ç‚È‚¢‚Æ
  ‚±‚ë‚âC‚à‚Á‚Æ•ª‚©‚è‚â‚·‚­‚Å‚«‚é•”•ª‚ð’m‚点‚Ä‚­‚¾‚³‚¢D•MŽÒ‚ɘA—‚·‚é
  ‚É‚ÍPeter.Baumann@dlr.de‚Ö“dŽqƒ[ƒ‹‚ðo‚µ‚Ä‚­‚¾‚³‚¢D“dŽqƒ[ƒ‹‚ð‘‚­
  Û‚ɂ́C“Ç‚ñ‚¾ Serial-Programming-HOWTO ‚̃o[ƒWƒ‡ƒ“(‚±‚Ì•¶‘‚̓o[
  ƒWƒ‡ƒ“1.0‚Å‚·)‚à‘‚¢‚Ä‚­‚¾‚³‚¢D

  –ó’: “ú–{Œê–ó‚̍ŐV”Å‚ÍJF ƒvƒƒWƒFƒNƒgƒz[ƒ€ƒy[ƒW ‚Å“üŽè‚Å‚«‚Ü‚·D‚Ü
  ‚½CŒë–󂪂 ‚ê‚ΖóŽÒ‚Ì•û‚Öƒ[ƒ‹‚ðo‚µ‚Ä‚­‚¾‚³‚¢D

  2.  ‚Í‚¶‚ß‚Ä‚Ý‚Ü‚µ‚傤

  2.1.  ƒfƒoƒbƒO‚Ì•û–@

  ‚ ‚È‚½‚ª‘‚¢‚½ƒR[ƒh‚ðƒfƒoƒbƒO‚·‚邽‚߂̍łà—Ç‚¢•û–@‚́CLinux ƒ}ƒVƒ“‚ð
  ‚à‚¤ˆê‘ä—pˆÓ‚µC“ñ‘ä‚̃Rƒ“ƒsƒ…[ƒ^‚ðƒkƒ‹ƒ‚ƒfƒ€ƒP[ƒuƒ‹‚Őڑ±‚·‚邱‚Æ‚Å
  ‚·Dminiterm(LDP ƒvƒƒOƒ‰ƒ}[ƒYƒKƒCƒh
  (ftp://sunsite.unc.edu/pub/Linux/docs/LDP/programmers-
  guide/lpg-0.4.tar.gz ‚Ì'examples'ƒfƒBƒŒƒNƒgƒŠ‚É‚ ‚è‚Ü‚·)‚ðŽg‚Á‚āC‚ ‚È
  ‚½‚Ì Linux ƒ}ƒVƒ“‚Ö•¶Žš‚ð‘—‚Á‚Ä‚Ý‚Ü‚µ‚傤Dminiterm ‚Í”ñí‚ÉŠÈ’P‚ɃRƒ“
  ƒpƒCƒ‹‚Å‚«CƒL[ƒ{[ƒh“ü—Í‚ðƒVƒŠƒAƒ‹ƒ|[ƒgŒo—R‚Å‚»‚Ì‚Ü‚Ü(raw)‘—‚è‚Ü
  ‚·D‚½‚¾Cdefine •¶ #define MODEMDEVICE "/dev/ttyS0"‚Ì•”•ª‚¾‚¯‚̓`ƒFƒb
  ƒN‚µ‚È‚­‚Ä‚Í‚È‚è‚Ü‚¹‚ñD‚±‚Ì•”•ª‚́CƒP[ƒuƒ‹‚Őڑ±‚·‚é‚Ì‚ª COM1 ‚Å‚ ‚ê
  ‚Î ttyS0CCOM2‚Å‚ ‚ê‚ÎttyS1‚̂悤‚ɐݒ肵‚Ü‚·D‚±‚̃eƒXƒg‚ő厖‚È“_
  ‚́C‘S‚Ä‚Ì•¶Žš‚Í‚»‚Ì‚Ü‚Ü(raw, o—͏ˆ—–³‚µ‚É)‘—M‚³‚ê‚邱‚Æ‚Å‚·DÚ‘±
  ƒeƒXƒg‚ð‚·‚é‚Æ‚«‚́C—¼•û‚̃}ƒVƒ“‚Å miniterm ‚ðŽÀs‚µCƒL[ƒ{[ƒh‚ð’@‚­
  ‚¾‚¯‚Å‚·D•Ð•û‚̃}ƒVƒ“‚Å“ü—Í‚³‚ꂽ•¶Žš‚́C‚à‚¤ˆê•û‚̃}ƒVƒ“‚ŏo—Í‚³‚ê‚Ü
  ‚·D‚»‚Ì‹t‚à“¯‚¶‚Å‚·D“ü—Í‚µ‚½•¶Žš‚́C“ü—Í‚µ‚½•û‚̃}ƒVƒ“‚̉æ–ʂɂ̓GƒR
  [‚³‚ê‚Ü‚¹‚ñD

  ƒkƒ‹ƒ‚ƒfƒ€ƒP[ƒuƒ‹‚ðŽ©ì‚·‚é‚ɂ́CTxD(‘—M)‚ÆRxD(ŽóM)‚ÌŒ‹ü‚ðƒNƒƒX‚³
  ‚¹‚Ü‚·DƒP[ƒuƒ‹‚ɂ‚¢‚Ă̏ڂµ‚¢‰ðà‚́CSerial-HOWTO ‚Ì‘æ7Í‚É‚ ‚è‚Ü
  ‚·D

  –¢Žg—p‚̃VƒŠƒAƒ‹ƒ|[ƒg‚ª2‚‚ ‚é‚Ì‚È‚ç‚΁Cˆê‘ä‚̃Rƒ“ƒsƒ…[ƒ^‚Å‚±‚̃eƒX
  ƒg‚ðŽÀs‚·‚邱‚Æ‚à‚Å‚«‚Ü‚·D‚±‚̏ꍇ‚́C2‚‚̉¼‘zƒRƒ“ƒ\[ƒ‹‚Å‚»‚ꂼ‚ê
  miniterm ‚ðŽÀs‚µ‚Ü‚·DƒVƒŠƒAƒ‹ƒ}ƒEƒX‚ðŠO‚µ‚ăVƒŠƒAƒ‹ƒ|[ƒg‚ð‹ó‚¯‚éê
  ‡‚ɂ́C/dev/mouse‚ð‘Š·‚¦‚邱‚Æ‚ð–Y‚ê‚È‚¢‚悤‚É‚µ‚Ü‚µ‚傤Dƒ}ƒ‹ƒ`ƒ|[
  ƒgƒVƒŠƒAƒ‹ƒJ[ƒh‚ðŽg‚Á‚Ä‚¢‚éê‡‚ɂ́CÝ’肪³‚µ‚¢‚±‚Æ‚ðŠm”F‚µ‚Ü‚µ‚å
  ‚¤D•MŽÒ‚ÍŽ©•ª‚̃}ƒVƒ“‚ÅŠÔˆá‚Á‚½Ý’è‚ð‚µ‚Ä‚¢‚½‚½‚߂ɁCŽ©•ª‚̃}ƒVƒ“‚Ńe
  ƒXƒg‚µ‚½Žž‚¾‚¯‚¤‚Ü‚­“®ì‚·‚é‚Æ‚¢‚¤Ž–‘Ô‚É‚È‚Á‚½‚±‚Æ‚ª‚ ‚è‚Ü‚·D‚±‚̐ݒè
  ‚Å‘¼‚̃Rƒ“ƒsƒ…[ƒ^‚ɐڑ±‚µ‚½Žž‚ɂ́C•¶Žš‚ªÁ‚¦‚Ä‚µ‚Ü‚¢‚Ü‚µ‚½D 2‚‚̃v
  ƒƒOƒ‰ƒ€‚ð1‚‚̃Rƒ“ƒsƒ…[ƒ^‚Å“®‚©‚·‚±‚Ƃ́CŠ®‘S‚É”ñ“¯Šú‚Æ‚ÍŒ¾‚¦‚Ü‚¹
  ‚ñD

  n

  2.2.  ƒ|[ƒg‚̐ݒè

  /dev/ttyS*‚Æ‚¢‚¤ƒfƒoƒCƒX‚Í’[––‚ð Linux ƒ}ƒVƒ“‚ÉŒq‚®‚½‚ß‚Ì‚à‚̂ŁC’ʐM
  ‚ðŽn‚ß‚½Œã‚Í’[––‚ɍ‡‚킹‚½Ý’肪s‚í‚ê‚Ü‚·D‚±‚Ì“_‚Í raw ƒfƒoƒCƒX‚ð
  Žg‚Á‚ĒʐM‚·‚éƒvƒƒOƒ‰ƒ€‚ðs‚¤ê‡‚ɂ́C’ˆÓ‚µ‚Ä‚¨‚©‚È‚¯‚ê‚΂Ȃè‚Ü‚ñD
  —Ⴆ‚΁C‘—‚Á‚½ƒLƒƒƒ‰ƒNƒ^‚ðƒGƒR[ƒoƒbƒN‚³‚¹‚é‚悤‚ɃVƒŠƒAƒ‹ƒ|[ƒg‚ðÝ’è
  ‚³‚ê‚Ä‚¢‚Ü‚·‚ªC’ʏíƒf[ƒ^‘—M‚Ì‚½‚ß‚É‚Í‚±‚̐ݒè‚͕ύX‚µ‚È‚¯‚ê‚΂¢‚¯‚Ü
  ‚¹‚ñD

  ‘S‚Ẵpƒ‰ƒ[ƒ^‚̓vƒƒOƒ‰ƒ€“à‚ÅŠÈ’P‚ɐݒè‚Å‚«‚Ü‚·DÝ’è‚̓wƒbƒ_ƒtƒ@ƒC
  ƒ‹<asm/termbits.h>‚Å’è‹`‚³‚ê‚Ä‚¢‚é termios \‘¢‘Ì‚É•Û‘¶‚³‚ê‚Ü‚·D

       #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 */
       };

  ‚±‚Ì<asm/termbits.h> ƒtƒ@ƒCƒ‹‚ɂ́Cƒtƒ‰ƒO‚Ì’è‹`‚à‘S‚Ä‹Lq‚³‚ê‚Ä‚¢‚Ü
  ‚·Dc_iflag ƒtƒ‰ƒO‚É‚Í“ü—̓‚[ƒh‚̃tƒ‰ƒO‚ª‚¢‚­‚‚©ŠÜ‚Ü‚ê‚Ä‚¨‚èC‘S‚Ä‚Ì
  “ü—͏ˆ—‚ðŽw’肵‚Ü‚·D“ü—͏ˆ—‚Ƃ́CƒfƒoƒCƒX‚©‚ç‘—‚ç‚ꂽƒLƒƒƒ‰ƒNƒ^
  ‚́Cread‚œǂݏo‚³‚ê‚é‘O‚ɏˆ—‚·‚邱‚Æ‚ª‚Å‚«‚é‚Æ‚¢‚¤‚±‚Æ‚Å‚·D“¯—l
  ‚ɁCc_oflag‚͏o—͏ˆ—‚ðˆµ‚¢‚Ü‚·D c_cflag‚́Cƒ{[ƒŒ[ƒg‚╶Žš–ˆ‚̃rƒb
  ƒg”CƒXƒgƒbƒvƒrƒbƒg‚Ȃǂ̃|[ƒgÝ’è‚ð‹L˜^‚µ‚Ä‚¢‚Ü‚·Dc_lflag “à‚̃[
  ƒJƒ‹ƒ‚[ƒhƒtƒ‰ƒO‚́C•¶Žš‚ªƒGƒR[‚³‚ê‚é‚©‚Ç‚¤‚©CƒvƒƒOƒ‰ƒ€‚ɃVƒOƒiƒ‹‚ª
  ‘—‚ç‚ê‚é‚©‚Ç‚¤‚©“™‚ðŽw’肵‚Ü‚·DÅŒã‚ɁC”z—ñ c_cc ‚ł́Cƒtƒ@ƒCƒ‹I
  ’[Cstop “™‚̐§Œä•¶Žš‚ð’è‹`‚µ‚Ü‚·D§Œä•¶Žš‚̃fƒtƒHƒ‹ƒg’l‚Í
  <asm/termios.h> ‚Å’è‹`‚³‚ê‚Ä‚¢‚Ü‚·DŠeƒtƒ‰ƒO‚ɂ‚¢‚ẮCƒIƒ“ƒ‰ƒCƒ“ƒ}
  ƒjƒ…ƒAƒ‹‚Ì termios(3) ‚Éà–¾‚ª‚ ‚è‚Ü‚·D\‘¢‘Ì termios‚Í POSIX €‹’‚Ì
  ƒVƒXƒeƒ€‚Å‚Í—p‚¢‚ç‚ê‚È‚¢C c_line—v‘f‚ðŠÜ‚ñ‚Å‚¢‚Ü‚·D

  2.3.  ƒVƒŠƒAƒ‹ƒfƒoƒCƒX‚É‚¨‚¯‚é“ü—Í‚ÌŠT”O

  ‚±‚±‚ł́C3‚‚̈قȂéŽí—Þ‚Ì“ü—Í‚ÌŠT”O‚ðà–¾‚µ‚Ü‚·D—˜—p–Ú“I‚ɏ]‚Á‚āC
  “KØ‚È‚à‚Ì‚ð‘I‘ð‚µ‚Ä‚­‚¾‚³‚¢D•¶Žš—ñ‘S‘Ì‚ðŽæ“¾‚·‚é‚̂ɁC1•¶Žš“ǂݍž‚Ý
  ‚̃‹[ƒv‚ðŽg‚¤‚±‚Æ‚Í‚Å‚«‚éŒÀ‚è”ð‚¯‚é‚ׂ«‚Å‚·DŽ„‚Í‚±‚ê‚ð‚â‚Á‚½‚Æ‚«C“Ç
  ‚ݍž‚ÝŽž‚É read ‚ª‘S‚­ƒGƒ‰[‚ðo—Í‚µ‚È‚©‚Á‚½‚Ì‚É‚à‚©‚©‚í‚炸C•¶Žš‚ªŒ‡
  ‚¯‚Ä‚µ‚Ü‚Á‚½‚±‚Æ‚ª‚ ‚è‚Ü‚µ‚½D

  2.3.1.  ƒJƒmƒjƒJƒ‹“ü—͏ˆ—

  ‚±‚ê‚Í’[––‚ɑ΂µ‚Ă̒ʏí‚̏ˆ—ƒ‚[ƒh‚Å‚·‚ªC‘¼‚̃fƒoƒCƒX‚Ƃ̒ʐM‚ÌŽž‚É
  ‚à•Ö—˜‚Å‚·D‘S‚Ä‚Ì“ü—͍͂s’PˆÊ‚ŏˆ—‚³‚ê‚Ü‚·D‚‚܂èCread ‚Í“ü—Í‚Ì1s
  ‘S‘Ì‚Ì‚Ý‚ð•Ô‚µ‚Ä‚«‚Ü‚·DƒfƒtƒHƒ‹ƒg‚ł́Cs‚ÍNL(ASCII ‚ÌLF)Cƒtƒ@ƒCƒ‹I
  ’[CsI’[•¶Žš‚Ì‚¢‚¸‚ê‚©‚ŏI‚è‚Ü‚·D•W€‚̐ݒè‚ł́CCR (DOS/Windows ‚Ì
  ƒfƒtƒHƒ‹ƒg‚̍sI’[•¶Žš)‚͍s‚̏I’[‚Æ‚Í‚È‚è‚Ü‚¹‚ñD

  ƒJƒmƒjƒJƒ‹“ü—͏ˆ—‚ł́CÁ‹Ž(erase)C’PŒê‚̍폜(delete word)C•¶Žš‚̍Ä
  o—Í(reprint characters)CCR‚ÌNL‚Ö‚Ì•ÏŠ·‚È‚Ç‚ðˆµ‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·D

  2.3.2.  ”ñƒJƒmƒjƒJƒ‹“ü—͏ˆ—

  ”ñƒJƒmƒjƒJƒ‹“ü—͏ˆ—‚́Cread –ˆ‚ÉŒˆ‚Ü‚Á‚½”‚Ì•¶Žš‚ðˆµ‚¤•û–@‚ŁCƒLƒƒƒ‰
  ƒNƒ^ƒ^ƒCƒ}‚ð—˜—p‚·‚邱‚Æ‚à‚Å‚«‚Ü‚·D‚±‚̃‚[ƒh‚̓AƒvƒŠƒP[ƒVƒ‡ƒ“‚ªŒˆ
  ‚Ü‚Á‚½•¶Žš”‚̃Lƒƒƒ‰ƒNƒ^‚ð“ǂݍž‚ÞŽž‚âCÚ‘±‚µ‚½ƒfƒoƒCƒX‚ª‘å—Ê‚Ì•¶Žš‚ð
  ‘—‚Á‚Ä‚­‚éê‡‚ÉŽg—p‚µ‚Ü‚·D

  2.3.3.  ”ñ“¯Šú“ü—Í

  ã‹L2‚‚̃‚[ƒh‚́C“¯Šú‹y‚Ñ”ñ“¯Šúƒ‚[ƒh‚ÅŽg‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·DƒfƒtƒHƒ‹
  ƒg‚́C“ü—Í‚ª‚¤‚Ü‚­‚¢‚­‚Ü‚Å read •¶‚ªƒuƒƒbƒN‚³‚ê‚铯Šúƒ‚[ƒh‚Å‚·D”ñ“¯
  Šúƒ‚[ƒh‚ł́Cread •¶‚Í‘¦À‚ɏI—¹‚µCŒã‚œǂݍž‚Ý‚ªŠ®—¹‚µ‚½Žž‚ɃvƒƒO
  ƒ‰ƒ€‚ɃVƒOƒiƒ‹‚ª‘—‚ç‚ê‚Ü‚·D‚±‚̃VƒOƒiƒ‹‚́CƒVƒOƒiƒ‹ƒnƒ“ƒhƒ‰‚ðŽg‚Á‚ÄŽó
  ‚¯Žæ‚è‚Ü‚·D

  2.3.4.  •¡”“ü—Í‚©‚ç‚Ì“ü—Í‘Ò‚¿

  ‚±‚ê‚Í•Ê‚Ì“ü—̓‚[ƒh‚Æ‚¢‚¤‚킯‚Å‚Í‚ ‚è‚Ü‚¹‚ñ‚ªC•¡”‚̃fƒoƒCƒX‚ðˆµ‚¤Žž
  ‚É•Ö—˜‚Å‚·D•MŽÒ‚̃AƒvƒŠƒP[ƒVƒ‡ƒ“‚ł́CTCP/IP ƒ\ƒPƒbƒgŒo—R‚Ì“ü—Í‚Æ‘¼
  ‚̃Rƒ“ƒsƒ…[ƒ^‚©‚ç‚̃VƒŠƒAƒ‹Ú‘±Œo—R‚Ì“ü—Í‚ð‹[Ž—“I‚É“¯Žž‚Ɉµ‚Á‚Ä‚¢‚Ü
  ‚·DˆÈ‰º‚ÉŽ¦‚·ƒvƒƒOƒ‰ƒ€—á‚ł́CˆÙ‚È‚é2‚‚̓ü—̓\[ƒX‚©‚ç‚Ì“ü—Í‘Ò‚¿‚ð
  s‚¢‚Ü‚·D•Ð•û‚̃\[ƒX‚©‚ç‚Ì“ü—Í‚ª‰Â”\‚É‚È‚é‚ƁC‚»‚Ì“ü—Í‚ªˆ—‚³‚êCƒv
  ƒƒOƒ‰ƒ€‚ÍŽŸ‚Ì“ü—Í‚ð‘Ò‚¿‚Ü‚·D

  ˆÈ‰º‚ÉŽ¦‚·ƒAƒvƒ[ƒ`‚Í‚¿‚å‚Á‚Æ•¡ŽG‚ÉŒ©‚¦‚Ü‚·‚ªCLinux ‚̓}ƒ‹ƒ`ƒvƒƒZƒb
  ƒVƒ“ƒO OS ‚Å‚ ‚邱‚Æ‚ð–Y‚ê‚Ä‚Í‚¢‚¯‚Ü‚¹‚ñDselectƒVƒXƒeƒ€ƒR[ƒ‹‚Í“ü—Í‘Ò
  ‚¿‚ÌŠÔ‚Í CPU ‚É•‰‰×‚ð—^‚¦‚Ü‚¹‚ñ‚ªCƒ‹[ƒv‚ðŽg‚Á‚½“ü—Í‘Ò‚¿‚ðs‚¤‚ƁC“¯
  Žž‚ÉŽÀs‚³‚ê‚Ä‚¢‚鑼‚̃vƒƒZƒX‚ª’x‚­‚È‚Á‚Ä‚µ‚Ü‚¢‚Ü‚·D

  3.  ƒvƒƒOƒ‰ƒ€—á

  ‘S‚Ä‚Ì—á‚Í miniterm.c ‚©‚çŽæ‚èo‚µ‚½‚à‚Ì‚Å‚·Dæs“ü—͂̃oƒbƒtƒ@‚Í 255
  •¶Žš‚ɐ§ŒÀ‚³‚ê‚Ä‚¢‚Ü‚·D‚±‚ê‚́CƒJƒmƒjƒJƒ‹“ü—͏ˆ—‚̍ő啶Žš’·‚Æ“¯‚¶‚Å
  ‚· (<linux/limits.h> ‚ ‚é‚¢‚Í <posix1_lim.h>‚ðŽQÆ)D

  ‚»‚ꂼ‚ê‚Ì“ü—̓‚[ƒh‚ÌŽg‚¢•û‚ɂ‚¢‚Ă̓vƒƒOƒ‰ƒ€’†‚̃Rƒƒ“ƒg‚ðŒ©‚Ä‚­‚¾
  ‚³‚¢DƒvƒƒOƒ‰ƒ€‚͏\•ª“Ç‚Ý‚±‚È‚¹‚é‚ÆŽv‚¢‚Ü‚·DƒJƒmƒjƒJƒ‹“ü—̓‚[ƒh‚Ì—á
  ‚ɂ͈ê”ԏڂµ‚¢ƒRƒƒ“ƒg‚ð•t‚¯‚Ä‚¢‚Ü‚·Dˆá‚¢‚ð‹­’²‚·‚邽‚߂ɁC‘¼‚Ì—á‚É‚Â
  ‚¢‚Ă̓JƒmƒjƒJƒ‹“ü—̓‚[ƒh‚Æ‚Ì‘Šˆá“_‚¾‚¯‚ð‘‚¢‚Ä‚¢‚Ü‚·D

  à–¾‚ÍŠ®‘S‚Å‚Í‚ ‚è‚Ü‚¹‚ñ‚ªC—E‹C‚ðo‚µ‚Ä—á‘è‚ÅŽÀŒ±‚µC‚ ‚È‚½‚Ì–Ú“I‚ɍÅ
  ‚à“K‚µ‚½‰ð‚ðŒ©‚Â‚¯‚¾‚µ‚Ä‚­‚¾‚³‚¢D

  Žg—p‚·‚éƒVƒŠƒAƒ‹ƒ|[ƒg‚ɂ́C“KØ‚ȃp[ƒ~ƒbƒVƒ‡ƒ“‚ð—^‚¦‚é‚Ì‚ð–Y‚ê‚È‚¢‚Å
  ‚­‚¾‚³‚¢(—á: chmod a+rw /dev/ttyS1)D

  3.1.  ƒJƒmƒjƒJƒ‹“ü—͏ˆ—

  #include <sys/types.h>
  #include <sys/stat.h>
  #include <fcntl.h>
  #include <termios.h>
  #include <stdio.h>

  /* <asm/termbits.h> ‚Å’è‹`‚³‚ê‚Ä‚¢‚éƒ{[ƒŒ[ƒg‚̐ݒèD‚±‚ê‚Í
  <termios.h>‚©‚çƒCƒ“ƒNƒ‹[ƒh‚³‚ê‚éD */
  #define BAUDRATE B38400
  /* “KØ‚ȃVƒŠƒAƒ‹ƒ|[ƒg‚ðŽw‚·‚悤‚ɁC‚±‚Ì’è‹`‚ð•ÏX‚·‚éD*/
  #define MODEMDEVICE "/dev/ttyS1"
  #define _POSIX_SOURCE 1  /* POSIX €‹’‚̃\[ƒX */

  #define FALSE 0
  #define TRUE 1

  volatile int STOP=FALSE;

  main()
  {
    int fd,c, res;
    struct termios oldtio,newtio;
    char buf[255];
  /*
    “ǂݏ‘‚«‚Ì‚½‚߂Ƀ‚ƒfƒ€ƒfƒoƒCƒX‚ðƒI[ƒvƒ“‚·‚éDƒmƒCƒY‚É‚æ‚Á‚Ä CTRL-C
    ‚ª‚½‚Ü‚½‚Ü”­¶‚µ‚Ä‚àÚ‘±‚ªØ‚ê‚È‚¢‚悤‚ɁCtty §Œä‚Í‚µ‚È‚¢D
  */

  fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
   if (fd <0) {perror(MODEMDEVICE); exit(-1); }

   tcgetattr(fd,&oldtio); /* Œ»Ý‚̃VƒŠƒAƒ‹ƒ|[ƒg‚̐ݒè‚ð‘Ò”ð‚³‚¹‚é*/
   bzero(&newtio, sizeof(newtio)); /* V‚µ‚¢ƒ|[ƒg‚̐ݒè‚̍\‘¢‘Ì‚ðƒNƒŠƒA‚·‚é */

  /*
    BAUDRATE: ƒ{[ƒŒ[ƒg‚̐ݒèDcfsetispeed ‚Æ cfsetospeed ‚àŽg—p‚Å‚«‚éD
    CRTSCTS : o—͂̃n[ƒhƒEƒFƒAƒtƒ[§Œä (•K—v‚ÈŒ‹ü‚ª‘S‚Ä‚³‚ê‚Ä‚¢‚éƒP[
              ƒuƒ‹‚ðŽg‚¤ê‡‚̂݁DSerial-HOWTO ‚Ì7Í‚ðŽQÆ‚Ì‚±‚Æ)
    CS8     : 8n1 (8 ƒrƒbƒgCƒmƒ“ƒpƒŠƒeƒBCƒXƒgƒbƒvƒrƒbƒg 1)
    CLOCAL  : ƒ[ƒJƒ‹Ú‘±Cƒ‚ƒfƒ€§Œä‚È‚µ
    CREAD   : ŽóM•¶Žš(receiving characters)‚ð—LŒø‚É‚·‚éD
  */
   newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;

  /*
    IGNPAR  : ƒpƒŠƒeƒBƒGƒ‰[‚̃f[ƒ^‚Í–³Ž‹‚·‚é
    ICRNL   : CR ‚ð NL ‚ɑΉž‚³‚¹‚é(‚±‚ê‚ðs‚í‚È‚¢‚ƁC‘¼‚̃Rƒ“ƒsƒ…[ƒ^‚Å
              CR ‚ð“ü—Í‚µ‚Ä‚àC“ü—Í‚ªI‚è‚É‚È‚ç‚È‚¢)
    ‚»‚êˆÈŠO‚̐ݒè‚ł́CƒfƒoƒCƒX‚Í raw ƒ‚[ƒh‚Å‚ ‚é(‘¼‚Ì“ü—͏ˆ—‚͍s‚í‚È‚¢)
  */
   newtio.c_iflag = IGNPAR | ICRNL;

  /*
   Raw ƒ‚[ƒh‚ł̏o—Í
  */
   newtio.c_oflag = 0;

  /*
    ICANON  : ƒJƒmƒjƒJƒ‹“ü—Í‚ð—LŒø‚É‚·‚é
    ‘S‚ẴGƒR[‚𖳌ø‚É‚µCƒvƒƒOƒ‰ƒ€‚ɑ΂µ‚ăVƒOƒiƒ‹‚Í‘—‚点‚È‚¢
  */
   newtio.c_lflag = ICANON;

  /*
    ‘S‚Ă̐§Œä•¶Žš‚ð‰Šú‰»‚·‚é
    ƒfƒtƒHƒ‹ƒg’l‚Í /usr/include/termios.h ‚ðŒ©‚ê‚Εª‚©‚邪CƒRƒƒ“ƒg‚ɏ‘
    ‚¢‚Ä‚ ‚é‚̂ŁC‚±‚±‚Å‚ÍŒ©‚é•K—v‚Í‚È‚¢D
  */
   newtio.c_cc[VINTR]    = 0;     /* Ctrl-c */
   newtio.c_cc[VQUIT]    = 0;     /* Ctrl-\ */
   newtio.c_cc[VERASE]   = 0;     /* del */
   newtio.c_cc[VKILL]    = 0;     /* @ */
   newtio.c_cc[VEOF]     = 4;     /* Ctrl-d */
   newtio.c_cc[VTIME]    = 0;     /* ƒLƒƒƒ‰ƒNƒ^ŠÔƒ^ƒCƒ}‚ðŽg‚í‚È‚¢ */
   newtio.c_cc[VMIN]     = 1;     /* 1•¶Žš—ˆ‚é‚܂ŁC“ǂݍž‚Ý‚ðƒuƒƒbƒN‚·‚é */
   newtio.c_cc[VSWTC]    = 0;     /* '\0' */
   newtio.c_cc[VSTART]   = 0;     /* Ctrl-q */
   newtio.c_cc[VSTOP]    = 0;     /* Ctrl-s */
   newtio.c_cc[VSUSP]    = 0;     /* Ctrl-z */
   newtio.c_cc[VEOL]     = 0;     /* '\0' */
   newtio.c_cc[VREPRINT] = 0;     /* Ctrl-r */
   newtio.c_cc[VDISCARD] = 0;     /* Ctrl-u */
   newtio.c_cc[VWERASE]  = 0;     /* Ctrl-w */
   newtio.c_cc[VLNEXT]   = 0;     /* Ctrl-v */
   newtio.c_cc[VEOL2]    = 0;     /* '\0' */

  /*
    ƒ‚ƒfƒ€ƒ‰ƒCƒ“‚ðƒNƒŠƒA‚µCƒ|[ƒg‚̐ݒè‚ð—LŒø‚É‚·‚é
  */
   tcflush(fd, TCIFLUSH);
   tcsetattr(fd,TCSANOW,&newtio);

  /*
    ’[––‚̐ݒèI—¹D“ü—Í‚ðˆ—‚·‚é‚Å‚«‚é‚悤‚É‚È‚Á‚½D
    —á‚ł́Cs‚̐擪‚É 'z' ‚ð“ü—Í‚·‚邱‚ƂŃvƒƒOƒ‰ƒ€‚ðI—¹‚³‚¹‚é
  */
   while (STOP==FALSE) {     /* I—¹ðŒ‚ª–ž‚½‚³‚ê‚é‚܂Ń‹[ƒv */
  /*
      255•¶ŽšˆÈã“ü—Í‚³‚ꂽê‡‚Å‚àCsI’[•¶Žš‚ª“ü—Í‚³‚ê‚é‚܂ł́Cƒvƒ
      ƒOƒ‰ƒ€‚ÌŽÀs‚Í read ‚ŃuƒƒbƒN‚³‚ê‚éD“ǂݍž‚ñ‚¾•¶Žš”‚ªCŽÀÛ‚É“ü
      —Í‚³‚ê‚Ä‚¢‚镶Žš”‚æ‚菭‚È‚¢ê‡‚ɂ́CŽŸ‰ñ‚Ì read ‚ÅŽc‚è‚Ì•¶Žš‚ª“Ç
      ‚ݍž‚Ü‚ê‚éD•Ï” res ‚É‚ÍŽÀÛ‚ɓǂݍž‚܂ꂽ•¶Žš”‚ªƒZƒbƒg‚³‚ê‚éD
  */
      res = read(fd,buf,255);
      buf[res]=0;             /* printf ‚ÅŽg‚¤‚½‚߁C•¶Žš—ñ‚̏I’[‚ðƒZƒbƒg‚·‚é */
      printf(":%s:%d\n", buf, res);
      if (buf[0]=='z') STOP=TRUE;
   }
   /* ƒ|[ƒg‚̐ݒè‚ðƒvƒƒOƒ‰ƒ€ŠJŽnŽž‚Ì‚à‚Ì‚É–ß‚· */
   tcsetattr(fd,TCSANOW,&oldtio);
  }

  3.2.  ”ñƒJƒmƒjƒJƒ‹“ü—͏ˆ—

  ”ñƒJƒmƒjƒJƒ‹“ü—͏ˆ—ƒ‚[ƒh‚ł́C“ü—Í‚ðs‚Æ‚µ‚Ă܂Ƃ߂邱‚Ƃ͍s‚í‚ꂸC
  “ü—͏ˆ—(erase, kill, delete “™)‚às‚í‚ê‚Ü‚¹‚ñD‚±‚̃‚[ƒh‚̐§Œä‚Í2‚Â
  ‚̃pƒ‰ƒ[ƒ^‚ōs‚¢‚Ü‚·D c_cc[VTIME]‚ŃLƒƒƒ‰ƒNƒ^ƒ^ƒCƒ}‚̐ݒè‚ðs‚¢C
  c_cc[VMIN]‚ł͓ǂݍž‚Ý‚ð–ž‘«‚·‚é‘O‚Ɏ󂯎æ‚éÅ¬‚Ì•¶Žš”‚ðÝ’肵‚Ü‚·D

  MIN > 0 ‚Å TIME = 0 ‚̏ꍇCMIN ‚œǂݍž‚Ý‚ª–ž‘«‚·‚é‘O‚Ɏ󂯎æ‚镶Žš”
  ‚ðÝ’肵‚Ü‚·DTIME ‚̓[ƒ‚Ȃ̂ŁCƒ^ƒCƒ}‚ÍŽg‚í‚ê‚Ü‚¹‚ñD

  MIN = 0 ‚Å TIME > 0 ‚̏ꍇ‚ɂ́CTIME ‚̓^ƒCƒ€ƒAƒEƒg’l‚É‚È‚è‚Ü‚·D“Ç‚Ý
  ž‚Ý‚Í1•¶Žš“ǂݍž‚܂ꂽê‡‚©CŽžŠÔ TIME (‘Ò‚¿ŽžŠÔ = TIME * 0.1 •b) ‚ð
  ‰ß‚¬‚½ê‡‚É–ž‘«‚³‚ê‚Ü‚·DŽžŠÔ‚ð‰z‚¦‚½ê‡‚ɂ́C•¶Žš‚Í•Ô‚³‚ê‚Ü‚¹‚ñD
  MIN > 0 ‚Å TIME > 0 ‚̏ꍇ‚ɂ́CTIME ‚̓Lƒƒƒ‰ƒNƒ^ŠÔƒ^ƒCƒ}‚̐ݒè‚É‚È‚è
  ‚Ü‚·D“ǂݍž‚Ý‚Í MIN •¶ŽšŽó‚¯Žæ‚Á‚½ê‡‚©C2‚‚̕¶Žš‚ðŽó‚¯Žæ‚éŠÔ‚ÌŽžŠÔ
  ‚ª TIME ‚ð‰z‚¦‚½ê‡‚É–ž‘«‚³‚ê‚Ü‚·Dƒ^ƒCƒ}‚Í1•¶ŽšŽó‚¯Žæ‚邲‚Ƃɏ‰Šú‰»
  ‚³‚ê‚Ü‚·D‚Ü‚½CÅ‰‚Ì1•¶Žš‚ðŽó‚¯Žæ‚é‚܂ł̓^ƒCƒ}‚Í—LŒø‚É‚Í‚È‚è‚Ü‚¹
  ‚ñD

  MIN = 0 ‚©‚ TIME = 0 ‚̏ꍇ‚ɂ́C“ǂݍž‚Ý‚Í‘¦À‚É–ž‘«‚³‚ê‚Ü‚·DŒ»Ý“Ç
  ‚ݍž‚݉”\‚È•¶Žš”‚©C—v‹‚µ‚½•¶Žš”‚ª–ß‚³‚ê‚Ü‚·DAntonio ‚³‚ñ‚É‚æ‚ê‚Î
  (contributions ŽQÆ)C“ǂݍž‚Ý‚Ì‘O‚É fcntl(fd, F_SETFL,FNDELAY); ‚ðŽÀ
  s‚·‚邱‚ƂŁC“¯‚¶Œ‹‰Ê‚𓾂邱‚Æ‚ª‚Å‚«‚Ü‚·D

  newtio.c_cc[VTIME] ‚Æ newtio.c_cc[VMIN] ‚ð•ÏX‚·‚邱‚ƂŁCˆÈã‚̃‚[ƒh
  ‚ð‘S‚ÄŽŽ‚·‚±‚Æ‚ª‚Å‚«‚Ü‚·D

  #include <sys/types.h>
  #include <sys/stat.h>
  #include <fcntl.h>
  #include <termios.h>
  #include <stdio.h>

  #define BAUDRATE B38400
  #define MODEMDEVICE "/dev/ttyS1"
  #define _POSIX_SOURCE 1 /* POSIX €‹’‚̃\[ƒX */
  #define FALSE 0
  #define TRUE 1

  volatile int STOP=FALSE;

  main()
  {
    int fd,c, res;
    struct termios oldtio,newtio;
    char buf[255];

   fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
   if (fd <0) {perror(MODEMDEVICE); exit(-1); }

   tcgetattr(fd,&oldtio); /* Œ»Ý‚̃|[ƒgÝ’è‚ð‘Ò”ð */

   bzero(&newtio, sizeof(newtio));
   newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
   newtio.c_iflag = IGNPAR;
   newtio.c_oflag = 0;

   /* set input mode (non-canonical, no echo,...) */
   newtio.c_lflag = 0;

   newtio.c_cc[VTIME]    = 0;   /* ƒLƒƒƒ‰ƒNƒ^ŠÔƒ^ƒCƒ}‚Í–¢Žg—p */
   newtio.c_cc[VMIN]     = 5;   /* 5•¶ŽšŽó‚¯Žæ‚é‚܂ŃuƒƒbƒN‚·‚é */

   tcflush(fd, TCIFLUSH);
   tcsetattr(fd,TCSANOW,&newtio);

   while (STOP==FALSE) {       /* “ü—̓‹[ƒv */
     res = read(fd,buf,255);   /* 5 •¶Žš“ü—Í‚³‚ꂽ‚ç–ß‚é */
     buf[res]=0;               /* printf ‚ðŽg‚¤‚½‚ß‚É•¶Žš—ñI’[‚ðƒZƒbƒg */
     printf(":%s:%d\n", buf, res);
     if (buf[0]=='z') STOP=TRUE;
   }
   tcsetattr(fd,TCSANOW,&oldtio);
  }

  3.3.  ”ñ“¯Šú“ü—Í

  #include <termios.h>
  #include <stdio.h>
  #include <unistd.h>
  #include <fcntl.h>
  #include <sys/signal.h>
  #include <sys/types.h>

  #define BAUDRATE B38400
  #define MODEMDEVICE "/dev/ttyS1"
  #define _POSIX_SOURCE 1 /* POSIX €‹’‚̃\[ƒX */
  #define FALSE 0
  #define TRUE 1

  volatile int STOP=FALSE;

  void signal_handler_IO (int status);   /* ƒVƒOƒiƒ‹ƒnƒ“ƒhƒ‰‚̐錾 */
  int wait_flag=TRUE;                    /* ƒVƒOƒiƒ‹‚ðŽó‚¯Žæ‚Á‚Ä‚¢‚È‚¯‚ê‚Î TRUE */

  main()
  {
    int fd,c, res;
    struct termios oldtio,newtio;
    struct sigaction saio;           /* ƒVƒOƒiƒ‹‚ðŽó‚¯‚½Žž‚Ì“®ì‚ð’è‹` */
    char buf[255];

    /* ƒfƒoƒCƒX‚ð”ñƒuƒƒbƒLƒ“ƒOƒ‚[ƒh‚ŃI[ƒvƒ“‚·‚é
       (read ‚Í‘¦À‚É–ß‚Á‚Ä‚­‚é‚悤‚É‚È‚é) */
    fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
    if (fd <0) {perror(MODEMDEVICE); exit(-1); }

    /* ƒfƒoƒCƒX‚ð”ñ“¯Šúƒ‚[ƒh‚É‚·‚é‘O‚ɁCƒVƒOƒiƒ‹ƒnƒ“ƒhƒ‰‚ðÝ’è‚·‚é */
    saio.sa_handler = signal_handler_IO;
    saio.sa_mask = 0;
    saio.sa_flags = 0;
    saio.sa_restorer = NULL;
    sigaction(SIGIO,&saio,NULL);

    /* ƒvƒƒZƒX‚ª SIGIO ‚ðŽó‚¯Žæ‚ê‚é‚悤‚É‚·‚é */
    fcntl(fd, F_SETOWN, getpid());
    /* ƒtƒ@ƒCƒ‹ƒfƒXƒNƒŠƒvƒ^‚ð”ñ“¯Šúƒ‚[ƒh‚É‚·‚é (ƒIƒ“ƒ‰ƒCƒ“ƒ}ƒjƒ…ƒAƒ‹‚É
       ‚æ‚ê‚΁CO_APPEND ‚Æ O_NONBLOCK ‚¾‚¯‚ª F_SETFL ‚Å“®ì‚·‚é‚Æ‚Ì‚±‚Ɓc
     */
    fcntl(fd, F_SETFL, FASYNC);

    tcgetattr(fd,&oldtio); /* save current port settings */
    /* V‚µ‚¢ƒ|[ƒg‚̐ݒè‚ðƒJƒmƒjƒJƒ‹“ü—͏ˆ—‚ɐݒ肷‚é */
    newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
    newtio.c_iflag = IGNPAR | ICRNL;
    newtio.c_oflag = 0;
    newtio.c_lflag = ICANON;
    newtio.c_cc[VMIN]=1;
    newtio.c_cc[VTIME]=0;
    tcflush(fd, TCIFLUSH);
    tcsetattr(fd,TCSANOW,&newtio);

    /* “ü—Í‘Ò‚¿‚ÌŠÔƒ‹[ƒv‚µ‚Ü‚·D’ʏí‚Í‚±‚±‚ʼn½‚ç‚©‚̍ì‹Æ‚ð‚·‚é */
    while (STOP==FALSE) {
      printf(".\n");usleep(100000);
      /* SIGIO ‚ðŽó‚¯Žæ‚èCwait_flag = FALSE ‚É‚È‚Á‚Ä‚¢‚ê‚Γü—Í‚ª—˜—p‰Â
         ”\‚Ȃ̂œǂݍž‚Ý‚ðs‚¤‚±‚Æ‚ª‚Å‚«‚é */
      if (wait_flag==FALSE) {
        res = read(fd,buf,255);
        buf[res]=0;
        printf(":%s:%d\n", buf, res);
        if (res==1) STOP=TRUE; /* CR ‚¾‚¯‚ª“ü—Í‚³‚ꂽê‡‚Ƀ‹[ƒvI—¹ */
        wait_flag = TRUE;      /* ŽŸ‚Ì“ü—Í‚ð‘Ò‚Â */
      }
    }
    /* ƒvƒƒOƒ‰ƒ€ŠJŽnŽž‚̃|[ƒgÝ’è‚𕜌³‚·‚é */
    tcsetattr(fd,TCSANOW,&oldtio);
  }

  /**********************************************************************
  * ƒVƒOƒiƒ‹ƒnƒ“ƒhƒ‰Dã‹L‚̃‹[ƒv‚Å•¶Žš‚ðŽó‚¯Žæ‚Á‚½‚±‚Æ‚ðŽ¦‚·‚½‚߂ɁC  *
  * wait_flag ‚É FALSE ‚ðƒZƒbƒg‚·‚éD                                   *
  ***********************************************************************/

  void signal_handler_IO (int status)
  {
    printf("received SIGIO signal.\n");
    wait_flag = FALSE;
  }

  3.4.  •¡”‚Ì“ü—Í‚©‚ç‚Ì“ü—Í‘Ò‚¿

  ‚±‚̏͂͊ȒP‚ɍς܂¹‚Ü‚·Dƒqƒ“ƒg‚ðŽ¦‚·‚±‚Æ‚ª–Ú“I‚Ȃ̂ŁCƒTƒ“ƒvƒ‹‚̃vƒ
  ƒOƒ‰ƒ€‚à’Z‚¢‚à‚Ì‚É‚µ‚Ä‚¢‚Ü‚·D‚±‚ÌŽd‘g‚̓VƒŠƒAƒ‹ƒ|[ƒg‚¾‚¯‚Å‚È‚­C‘S‚Ä
  ‚̃tƒ@ƒCƒ‹ƒfƒXƒNƒŠƒvƒ^‚̏W‡‚ɑ΂µ‚ÄŽg‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·D

  select ƒVƒXƒeƒ€ƒR[ƒ‹‚Æ‚±‚ê‚É”º‚¤ƒ}ƒNƒ‚ł́Cfd_set ‚ðŽg‚¢‚Ü‚·D‚±‚ê
  ‚́C‘S‚Ä‚Ì—LŒø‚ȃtƒ@ƒCƒ‹ƒfƒXƒNƒŠƒvƒ^‚̃Gƒ“ƒgƒŠ[‚ªŠÜ‚Ü‚ê‚éƒrƒbƒg—ñ‚Å
  ‚·Dselect ‚̓tƒ@ƒCƒ‹ƒfƒXƒNƒŠƒvƒ^‚ɑΉž‚·‚éƒrƒbƒgW‡ fd_set‚ðˆø”‚Æ
  ‚µCfd_set‚É“üo—Í‚ª‰Â”\‚ȃtƒ@ƒCƒ‹ƒfƒXƒNƒŠƒvƒ^C‚ ‚é‚¢‚Í—áŠO‚ª”­¶‚µ‚½
  ƒtƒ@ƒCƒ‹ƒfƒXƒNƒŠƒvƒ^‚̏W‡‚ðƒZƒbƒg‚µ‚Ü‚·Dfd_set ‚Ì‘€ì‚Í—pˆÓ‚³‚ê‚Ä‚¢
  ‚éƒ}ƒNƒ‚ōs‚¢‚Ü‚·DÚ‚µ‚­‚̓Iƒ“ƒ‰ƒCƒ“ƒ}ƒjƒ…ƒAƒ‹‚Ì select(2) ‚ðŽQÆ‚µ
  ‚Ä‚­‚¾‚³‚¢D

  #include <sys/time.h>
  #include <sys/types.h>
  #include <unistd.h>

  main()
  {
     int    fd1, fd2;  /* “ü—̓\[ƒX 1, 2 */
     fd_set readfs;    /* ƒtƒ@ƒCƒ‹ƒfƒXƒNƒŠƒvƒ^‚̏W‡ */
     int    maxfd;     /* Žg‚í‚ê‚Ä‚¢‚éƒtƒ@ƒCƒ‹ƒfƒXƒNƒŠƒvƒ^‚̍őå’l */
     int    loop=1;    /* ƒ‹[ƒv‚µ‚Ä‚¢‚éŠÔ‚Í TRUE */

     /* open_input_source ‚ł̓fƒoƒCƒX‚̃I[ƒvƒ“C³‚µ‚¢ƒ|[ƒg‚̐ݒ肪s‚í
        ‚êCƒtƒ@ƒCƒ‹ƒfƒXƒNƒŠƒvƒ^‚ª–ß‚µ’l‚É‚È‚Á‚Ä‚¢‚é‚à‚Ì‚Æ‚·‚éD */
     fd1 = open_input_source("/dev/ttyS1");   /* COM2 */
     if (fd1 <0) exit(0);
     fd2 = open_input_source("/dev/ttyS2");   /* COM3 */
     if (fd2 <0) exit(0);
     maxfd = MAX (fd1, fd2)+1;  /* ’²‚ׂéƒrƒbƒg’·‚̍őå’l */

     /* “ü—Í‚Ì‚½‚߂̃‹[ƒv */
     while (loop) {
       FD_SET(fd1, &readfs);  /* ƒ\[ƒX 1 ‚𒲂ׂ邱‚Æ‚ðŽw’è */
       FD_SET(fd2, &readfs);  /* ƒ\[ƒX 2 ‚𒲂ׂ邱‚Æ‚ðŽw’è */
       /* block until input becomes available */
       select(maxfd, &readfs, NULL, NULL, NULL);
       if (FD_ISSET(fd1))         /* ƒ\[ƒX 1 ‚©‚ç‚Ì“ü—Í‚ª‰Â”\ */
         handle_input_from_source1();
       if (FD_ISSET(fd2))         /* ƒ\[ƒX 2 ‚©‚ç‚Ì“ü—Í‚ª‰Â”\ */
         handle_input_from_source2();
     }

  }

  ‚±‚Ì—á‚ł́C‚Ç‚¿‚ç‚©‚̃\[ƒX‚©‚ç“ü—Í‚ªs‚í‚ê‚é‚܂ŁCƒvƒƒOƒ‰ƒ€‚ª‚¢‚‚Ü
  ‚Å‚àƒuƒƒbƒN‚³‚ê‚Ä‚µ‚Ü‚¢‚Ü‚·D“ü—͂̃^ƒCƒ€ƒAƒEƒg‚ðŽw’肵‚½‚¢ê‡‚ɂ́C
  select ƒVƒXƒeƒ€ƒR[ƒ‹‚Ì•”•ª‚ðŽŸ‚Ì‚æ‚¤‚ɏ‘‚«Š·‚¦‚Ü‚·D

       int res;
       struct timeval Timeout;

       /* “ü—̓‹[ƒv‚ł̃^ƒCƒ€ƒAƒEƒg’l‚ðÝ’è */
       Timeout.tv_usec = 0;  /* ƒ~ƒŠ•b */
       Timeout.tv_sec  = 1;  /* •b */
       res = select(maxfd, &readfs, NULL, NULL, &Timeout);
       if (res==0)
       /* “ü—Í‚ª‚ ‚Á‚½ƒtƒ@ƒCƒ‹ƒfƒXƒNƒŠƒvƒ^‚̐”‚ª 0 ‚È‚ç‚΁Cƒ^ƒCƒ€ƒAƒEƒg”­¶ */

  ‚±‚Ì—á‚Å‚Í 1 •bŒã‚Ƀ^ƒCƒ€ƒAƒEƒg‚É‚È‚è‚Ü‚·Dƒ^ƒCƒ€ƒAƒEƒg‚Æ‚È‚Á‚½ê‡‚É
  ‚́Cselect ‚Í 0 ‚ð•Ô‚µ‚Ü‚·‚ªCTimeout ‚Í select‚ªŽÀÛ‚É“ü—Í‚ð‘Ò‚Á‚½Žž
  ŠÔ‚Ì•ª‚¾‚¯Œ¸‚炳‚ê‚邱‚Æ‚É’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢Dƒ^ƒCƒ€ƒAƒEƒg’l‚ªƒ[ƒ‚̏ꍇ
  ‚ɂ́Cselect ‚Í‘¦À‚É‹A‚Á‚Ä‚«‚Ü‚·D

  4.  ‘¼‚̏î•ñŒ¹

  o  Linux Serial-HOWTO ‚ɂ̓VƒŠƒAƒ‹ƒ|[ƒg‚̐ݒè•û–@‚ƁCƒn[ƒhƒEƒFƒA‚̏î
     •ñ‚ª‘‚©‚ê‚Ä‚¢‚Ü‚·D

  o  Serial Programming Guide for POSIX Compliant Operating Systems
     <http://www.easysw.com/~mike/serial>DMichael Sweet ‚³‚ñ‚̃y[ƒW‚Å
     ‚·D‚±‚̃Šƒ“ƒN‚Í‚½‚Ç‚ê‚È‚­‚È‚Á‚Ä‚µ‚Ü‚Á‚½‚Ì‚Å‚·‚ªCV‚µ‚¢ URL ‚ª‚í‚©
     ‚è‚Ü‚¹‚ñD‚Ç‚È‚½‚©‹³‚¦‚Ä‚­‚¾‚³‚¢D—Ç‚­‚Å‚«‚½•¶‘‚¾‚Á‚½‚̂ɁI

  o  ƒIƒ“ƒ‰ƒCƒ“ƒ}ƒjƒ…ƒAƒ‹‚Ìtermios(3)‚ɂ́Ctermios \‘¢‘Ì‚Ì‘S‚Ẵtƒ‰ƒO
     ‚Ìà–¾‚ª‚ ‚è‚Ü‚·D

  5.  ƒRƒ“ƒgƒŠƒrƒ…[ƒVƒ‡ƒ“

  Å‰‚ɏq‚ׂ½‚悤‚ɁC•MŽÒ‚Í‚±‚Ì•ª–ì‚̃GƒLƒXƒp[ƒg‚Å‚Í‚ ‚è‚Ü‚¹‚ñD‚µ‚©
  ‚µCŽ©•ªŽ©g‚Å–â‘è‚É’¼–Ê‚µC‘¼‚̐l‚̏•‚¯‚ðŽØ‚è‚È‚ª‚ç–â‘è‚ð‰ðŒˆ‚µ‚Ü‚µ
  ‚½D European Transonic Windtunnel, Cologne ‚Ì Strudthoff ŽC Michael
  Carter Ž (mcarter@rocke.electro.swri.eduCPeter Waltenberg Ž
  (p.waltenberg@karaka.chch.cri.nz)‚ÌŠF—l‚ÉŠ´ŽÓ‚µ‚Ü‚·D

  Antonino Ianella Ž(antonino@usa.net‚́C•MŽÒ‚ª‚±‚Ì•¶‘‚ð€”õ‚µ‚Ä‚¢‚é‚Ì
  ‚Æ‚Ù‚Ú“¯Žž‚É Serial-Port-Programming Mini HOWTO ‚ðì¬‚µ‚Ü‚µ‚½DGreg
  Hankins Ž‚Ì’ñˆÄ‚É‚æ‚èCAntonino Ž‚Ì Mini-HOWTO ‚ð–{•¶‘‚Æ“‡‚µ‚Ü‚µ
  ‚½D

  ‚±‚Ì•¶‘‚̍\‘¢‚Æ SGML ‚É‚æ‚鐮Œ`‚́CGreg Hankins Ž‚Ì Serial-HOWTO ‚ð
  Šî‚É‚µ‚Ä‚¢‚Ü‚·D–{•¶‘‚ɏC³‚ð“ü‚ê‚Ä‚­‚ꂽ Dave Pfaltzgraff
  Ž(Dave_Pfaltzgraff@patapsco.com)C Sean Lincolne
  Ž(slincol@tpgi.com.au)C Michael Wiedmann Ž (mw@miwie.in-
  berlin.de)C Adrey Bonar Ž(andy@tipas.lt) ‚ÌŠF‚³‚ñ‚ÉŠ´ŽÓ‚µ‚Ü‚·D