The Linux Serial Programming HOWTO
 by Peter H. Baumann, [email protected]
 v1.0, 22 January 1998
 �����P��, [email protected]
 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��ł��� [email protected] ����
 �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������
 �ɂ�[email protected]�֓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 �� ([email protected]�CPeter Waltenberg ��
 ([email protected])�̊F�l�Ɋ��ӂ��܂��D

 Antonino Ianella ��([email protected]�́C�M�҂����̕���������Ă����
 �Ƃقړ����� Serial-Port-Programming Mini HOWTO ��쐬���܂����DGreg
 Hankins ���̒�Ăɂ��CAntonino ���� Mini-HOWTO ��{�����Ɠ������܂�
 ���D

 ���̕����̍\���� SGML �ɂ�鐮�`�́CGreg Hankins ���� Serial-HOWTO ��
 ��ɂ��Ă��܂��D�{�����ɏC�����Ă��ꂽ Dave Pfaltzgraff
 ��([email protected])�C Sean Lincolne
 ��([email protected])�C Michael Wiedmann �� ([email protected]
 berlin.de)�C Adrey Bonar ��([email protected]) �̊F����Ɋ��ӂ��܂��D