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