���Υڡ��� ���Υڡ��� �ܼ���

3. �ץ��������

���Ƥ���� miniterm.c ������Ф�����ΤǤ���������ϤΥХ� �ե��� 255 ʸ�������¤���Ƥ��ޤ�������ϡ����Υ˥������Ͻ����κ���ʸ ��Ĺ��Ʊ���Ǥ� (<linux/limits.h> ���뤤�� <posix1_lim.h>�򻲾�)��

���줾������ϥ⡼�ɤλȤ����ˤĤ��Ƥϥץ��������Υ����Ȥ򸫤Ƥ��� �������ץ������Ͻ�ʬ�ɤߤ��ʤ���Ȼפ��ޤ������Υ˥������ϥ⡼�ɤ��� �ˤϰ��־ܤ��������Ȥ��դ��Ƥ��ޤ����㤤��Ĵ���뤿��ˡ�¾����ˤ� ���Ƥϥ��Υ˥������ϥ⡼�ɤȤ������������񤤤Ƥ��ޤ���

�����ϴ����ǤϤ���ޤ��󤬡�ͦ����Ф�������Ǽ¸��������ʤ�����Ū�˺� ��Ŭ������򸫤Ĥ������Ƥ���������

���Ѥ��륷�ꥢ��ݡ��Ȥˤϡ�Ŭ�ڤʥѡ��ߥå�����Ϳ����Τ�˺��ʤ��� ��������(��: chmod a+rw /dev/ttyS1)��

3.1 ���Υ˥������Ͻ���

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

/* <asm/termbits.h> ���������Ƥ���ܡ��졼�Ȥ����ꡥ�����
<termios.h>���饤�󥯥롼�ɤ���롥 */
#define BAUDRATE B38400            
/* Ŭ�ڤʥ��ꥢ��ݡ��Ȥ�ؤ��褦�ˡ�����������ѹ����롥*/
#define MODEMDEVICE "/dev/ttyS1"
#define _POSIX_SOURCE 1  /* POSIX �������� */

#define FALSE 0
#define TRUE 1

volatile int STOP=FALSE; 

main()
{
  int fd,c, res;
  struct termios oldtio,newtio;
  char buf[255];
/*
  �ɤ߽񤭤Τ���˥�ǥ�ǥХ����򥪡��ץ󤹤롥�Υ����ˤ�ä� CTRL-C 
  �����ޤ���ȯ�����Ƥ���³���ڤ�ʤ��褦�ˡ�tty ����Ϥ��ʤ���
*/

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

 tcgetattr(fd,&oldtio); /* ���ߤΥ��ꥢ��ݡ��Ȥ���������򤵤���*/
 bzero(&newtio, sizeof(newtio)); /* �������ݡ��Ȥ�����ι�¤�Τ򥯥ꥢ���� */

/* 
  BAUDRATE: �ܡ��졼�Ȥ����ꡥcfsetispeed �� cfsetospeed ����ѤǤ��롥
  CRTSCTS : ���ϤΥϡ��ɥ������ե������� (ɬ�פʷ��������Ƥ���Ƥ��륱��
            �֥��Ȥ����Τߡ�Serial-HOWTO ��7�Ϥ򻲾ȤΤ���)
  CS8     : 8n1 (8 �ӥåȡ��Υ�ѥ�ƥ������ȥåץӥå� 1)
  CLOCAL  : ����������³����ǥ�����ʤ�
  CREAD   : ����ʸ��(receiving characters)��ͭ���ˤ��롥
*/
 newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
 
/*
  IGNPAR  : �ѥ�ƥ����顼�Υǡ�����̵�뤹��
  ICRNL   : CR �� NL ���б�������(�����Ԥ�ʤ��ȡ�¾�Υ���ԥ塼���� 
            CR �����Ϥ��Ƥ⡤���Ϥ�����ˤʤ�ʤ�)
  ����ʳ�������Ǥϡ��ǥХ����� raw �⡼�ɤǤ���(¾�����Ͻ����ϹԤ�ʤ�)
*/
 newtio.c_iflag = IGNPAR | ICRNL;
 
/*
 Raw �⡼�ɤǤν���
*/
 newtio.c_oflag = 0;
 
/*
  ICANON  : ���Υ˥������Ϥ�ͭ���ˤ���
  ���ƤΥ�������̵���ˤ����ץ��������Ф��ƥ����ʥ�����餻�ʤ�
*/
 newtio.c_lflag = ICANON;
 
/* 
  ���Ƥ�����ʸ������������
  �ǥե�����ͤ� /usr/include/termios.h �򸫤��ʬ���뤬�������Ȥ˽�
  ���Ƥ���Τǡ������Ǥϸ���ɬ�פϤʤ���
*/
 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;     /* ����饯���֥����ޤ�Ȥ�ʤ� */
 newtio.c_cc[VMIN]     = 1;     /* 1ʸ�����ޤǡ��ɤ߹��ߤ�֥��å����� */
 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' */

/* 
  ��ǥ�饤��򥯥ꥢ�����ݡ��Ȥ������ͭ���ˤ���
*/
 tcflush(fd, TCIFLUSH);
 tcsetattr(fd,TCSANOW,&newtio);

/*
  ü�������꽪λ�����Ϥ��������Ǥ���褦�ˤʤä���
  ��Ǥϡ��Ԥ���Ƭ�� 'z' �����Ϥ��뤳�Ȥǥץ�������λ������
*/
 while (STOP==FALSE) {     /* ��λ��郎���������ޤǥ롼�� */
/*
    255ʸ���ʾ����Ϥ��줿���Ǥ⡤�Խ�üʸ�������Ϥ����ޤǤϡ��ץ�
    �����μ¹Ԥ� read �ǥ֥��å�����롥�ɤ߹����ʸ���������ºݤ���
    �Ϥ���Ƥ���ʸ������꾯�ʤ����ˤϡ������ read �ǻĤ��ʸ������
    �߹��ޤ�롥�ѿ� res �ˤϼºݤ��ɤ߹��ޤ줿ʸ���������åȤ���롥
*/
    res = read(fd,buf,255); 
    buf[res]=0;             /* printf �ǻȤ����ᡤʸ����ν�ü�򥻥åȤ��� */
    printf(":%s:%d\n", buf, res);
    if (buf[0]=='z') STOP=TRUE;
 }
 /* �ݡ��Ȥ������ץ�����೫�ϻ��Τ�Τ��᤹ */
 tcsetattr(fd,TCSANOW,&oldtio);
}

3.2 �󥫥Υ˥������Ͻ���

�󥫥Υ˥������Ͻ����⡼�ɤǤϡ����Ϥ�ԤȤ��ƤޤȤ�뤳�ȤϹԤ�줺�� ���Ͻ���(erase, kill, delete ��)��Ԥ��ޤ��󡥤��Υ⡼�ɤ������2�� �Υѥ�᡼���ǹԤ��ޤ��� c_cc[VTIME]�ǥ���饯�������ޤ������Ԥ��� c_cc[VMIN]�Ǥ��ɤ߹��ߤ���­�������˼������Ǿ���ʸ���������� ���ޤ���

MIN > 0 �� TIME = 0 �ξ�硤MIN ���ɤ߹��ߤ���­�������˼������ʸ ���������ꤷ�ޤ���TIME �ϥ����ʤΤǡ������ޤϻȤ��ޤ���

MIN = 0 �� TIME > 0 �ξ��ˤϡ�TIME �ϥ����ॢ�����ͤˤʤ�ޤ����� �߹��ߤ�1ʸ���ɤ߹��ޤ줿��礫������ TIME (�Ԥ����� = TIME * 0.1 ��) ��᤮��������­����ޤ������֤�ۤ������ˤϡ�ʸ�����֤���ޤ���

MIN > 0 �� TIME > 0 �ξ��ˤϡ�TIME �ϥ���饯���֥����ޤ����� �ˤʤ�ޤ����ɤ߹��ߤ� MIN ʸ��������ä���礫��2�Ĥ�ʸ����������� �λ��֤� TIME ��ۤ���������­����ޤ��������ޤ�1ʸ��������뤴�Ȥ� ���������ޤ����ޤ����ǽ��1ʸ����������ޤǤϥ����ޤ�ͭ���ˤϤʤ� �ޤ���

MIN = 0 ���� TIME = 0 �ξ��ˤϡ��ɤ߹��ߤ�¨�¤���­����ޤ��������� �߹��߲�ǽ��ʸ���������׵ᤷ��ʸ�������ᤵ��ޤ���Antonio ����ˤ��� (contributions ����)���ɤ߹��ߤ����� fcntl(fd, F_SETFL,FNDELAY); ��¹Ԥ��뤳�Ȥǡ�Ʊ����̤����뤳�Ȥ��Ǥ��ޤ���

newtio.c_cc[VTIME] �� newtio.c_cc[VMIN] ���ѹ����뤳 �Ȥǡ��ʾ�Υ⡼�ɤ����ƻ���Ȥ��Ǥ��ޤ���

#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 �������� */
#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); /* ���ߤΥݡ������������ */

 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;   /* ����饯���֥����ޤ�̤���� */
 newtio.c_cc[VMIN]     = 5;   /* 5ʸ���������ޤǥ֥��å����� */

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


 while (STOP==FALSE) {       /* ���ϥ롼�� */
   res = read(fd,buf,255);   /* 5 ʸ�����Ϥ��줿����� */
   buf[res]=0;               /* printf ��Ȥ������ʸ����ü�򥻥å� */
   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 �������� */
#define FALSE 0
#define TRUE 1

volatile int STOP=FALSE; 

void signal_handler_IO (int status);   /* �����ʥ�ϥ�ɥ����� */
int wait_flag=TRUE;                    /* �����ʥ�������äƤ��ʤ���� TRUE */

main()
{
  int fd,c, res;
  struct termios oldtio,newtio;
  struct sigaction saio;           /* �����ʥ�����������ư������ */
  char buf[255];

  /* �ǥХ�������֥��å��󥰥⡼�ɤǥ����ץ󤹤�
     (read ��¨�¤���äƤ���褦�ˤʤ�) */
  fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
  if (fd <0) {perror(MODEMDEVICE); exit(-1); }

  /* �ǥХ�������Ʊ���⡼�ɤˤ������ˡ������ʥ�ϥ�ɥ�����ꤹ�� */
  saio.sa_handler = signal_handler_IO;
  saio.sa_mask = 0;
  saio.sa_flags = 0;
  saio.sa_restorer = NULL;
  sigaction(SIGIO,&saio,NULL);
  
  /* �ץ������� SIGIO ���������褦�ˤ��� */
  fcntl(fd, F_SETOWN, getpid());
  /* �ե�����ǥ�����ץ�����Ʊ���⡼�ɤˤ��� (����饤��ޥ˥奢���
     ���С�O_APPEND �� O_NONBLOCK ������ F_SETFL ��ư���ȤΤ��ȡ� 
   */
  fcntl(fd, F_SETFL, FASYNC);

  tcgetattr(fd,&oldtio); /* save current port settings */
  /* �������ݡ��Ȥ�����򥫥Υ˥������Ͻ��������ꤹ�� */
  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);
 
  /* �����Ԥ��δ֥롼�פ��ޤ����̾�Ϥ����Dz��餫�κ�Ȥ򤹤� */
  while (STOP==FALSE) {
    printf(".\n");usleep(100000);
    /* SIGIO �������ꡤwait_flag = FALSE �ˤʤäƤ�������Ϥ����Ѳ�
       ǽ�ʤΤ��ɤ߹��ߤ�Ԥ����Ȥ��Ǥ��� */
    if (wait_flag==FALSE) { 
      res = read(fd,buf,255);
      buf[res]=0;
      printf(":%s:%d\n", buf, res);
      if (res==1) STOP=TRUE; /* CR ���������Ϥ��줿���˥롼�׽�λ */
      wait_flag = TRUE;      /* �������Ϥ��Ԥ� */
    }
  }
  /* �ץ�����೫�ϻ��Υݡ���������������� */
  tcsetattr(fd,TCSANOW,&oldtio);
}

/**********************************************************************
* �����ʥ�ϥ�ɥ顥�嵭�Υ롼�פ�ʸ���������ä����Ȥ򼨤�����ˡ�  *
* wait_flag �� FALSE �򥻥åȤ��롥                                   *
***********************************************************************/

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

3.4 ʣ�������Ϥ���������Ԥ�

���ξϤϴ�ñ�˺Ѥޤ��ޤ����ҥ�Ȥ򼨤����Ȥ���Ū�ʤΤǡ�����ץ�Υץ� ������û����Τˤ��Ƥ��ޤ������λ��Ȥϥ��ꥢ��ݡ��Ȥ����Ǥʤ������� �Υե�����ǥ�����ץ��ν�����Ф��ƻȤ����Ȥ��Ǥ��ޤ���

select �����ƥॳ����Ȥ����ȼ���ޥ����Ǥϡ�fd_set ��Ȥ��� ��������ϡ����Ƥ�ͭ���ʥե�����ǥ�����ץ��Υ���ȥ꡼���ޤޤ��ӥ� ����Ǥ���select �ϥե�����ǥ�����ץ����б�����ӥåȽ��� fd_set������Ȥ���fd_set�������Ϥ���ǽ�ʥե�����ǥ� ����ץ������뤤���㳰��ȯ�������ե�����ǥ�����ץ��ν���򥻥åȤ��� ����fd_set �������Ѱդ���Ƥ���ޥ����ǹԤ��ޤ����ܤ����ϥ� ��饤��ޥ˥奢��� select(2) �򻲾Ȥ��Ƥ���������

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

main()
{
   int    fd1, fd2;  /* ���ϥ����� 1, 2 */
   fd_set readfs;    /* �ե�����ǥ�����ץ��ν��� */
   int    maxfd;     /* �Ȥ��Ƥ���ե�����ǥ�����ץ��κ����� */
   int    loop=1;    /* �롼�פ��Ƥ���֤� TRUE */

   /* open_input_source �ǤϥǥХ����Υ����ץ��������ݡ��Ȥ����꤬�Ԥ�
      �졤�ե�����ǥ�����ץ����ᤷ�ͤˤʤäƤ����ΤȤ��롥 */
   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;  /* Ĵ�٤�ӥå�Ĺ�κ����� */

   /* ���ϤΤ���Υ롼�� */
   while (loop) {
     FD_SET(fd1, &readfs);  /* ������ 1 ��Ĵ�٤뤳�Ȥ���� */
     FD_SET(fd2, &readfs);  /* ������ 2 ��Ĵ�٤뤳�Ȥ���� */
     /* block until input becomes available */
     select(maxfd, &readfs, NULL, NULL, NULL);
     if (FD_ISSET(fd1))         /* ������ 1 ��������Ϥ���ǽ */
       handle_input_from_source1();
     if (FD_ISSET(fd2))         /* ������ 2 ��������Ϥ���ǽ */
       handle_input_from_source2();
   }

}   

������Ǥϡ��ɤ��餫�Υ������������Ϥ��Ԥ���ޤǡ��ץ�����ब���Ĥ� �Ǥ�֥��å�����Ƥ��ޤ��ޤ������ϤΥ����ॢ���Ȥ���ꤷ�������ˤϡ� select �����ƥॳ�������ʬ�򼡤Τ褦�˽񤭴����ޤ���

int res;
struct timeval Timeout;

/* ���ϥ롼�פǤΥ����ॢ�����ͤ����� */
Timeout.tv_usec = 0;  /* �ߥ��� */
Timeout.tv_sec  = 1;  /* �� */
res = select(maxfd, &readfs, NULL, NULL, &Timeout);
if (res==0)
/* ���Ϥ����ä��ե�����ǥ�����ץ��ο��� 0 �ʤ�С������ॢ����ȯ�� */
������Ǥ� 1 �ø�˥����ॢ���Ȥˤʤ�ޤ��������ॢ���ȤȤʤä����� �ϡ�select �� 0 ���֤��ޤ�����Timeout �� select���ºݤ����Ϥ��Ԥä����֤�ʬ�������餵��뤳�Ȥ����դ� �Ƥ��������������ॢ�����ͤ������ξ��ˤϡ�select ��¨�¤˵��� �Ƥ��ޤ���


���Υڡ��� ���Υڡ��� �ܼ���