���Ƥ���� miniterm.c
������Ф�����ΤǤ���������ϤΥХ�
�ե��� 255 ʸ�������¤���Ƥ��ޤ�������ϡ����Υ˥������Ͻ����κ���ʸ
��Ĺ��Ʊ���Ǥ� (<linux/limits.h>
���뤤��
<posix1_lim.h>
��)��
���줾������ϥ⡼�ɤλȤ����ˤĤ��Ƥϥץ��������Υ����ȤƤ��� �������ץ������Ͻ�ʬ�ɤߤ��ʤ���Ȼפ��ޤ������Υ˥������ϥ⡼�ɤ��� �ˤϰ��־ܤ��������Ȥ��դ��Ƥ��ޤ����㤤��Ĵ���뤿��ˡ�¾����ˤ� ���Ƥϥ��Υ˥������ϥ⡼�ɤȤ������������Ƥ��ޤ���
�����ϴ����ǤϤ���ޤ���ͦ����Ф�������Ǽ¸��������ʤ�����Ū�˺� ��Ŭ������Ĥ������Ƥ���������
���Ѥ��륷�ꥢ��ݡ��Ȥˤϡ�Ŭ�ڤʥѡ��ߥå�����Ϳ����Τ�˺��ʤ���
��������(��: chmod a+rw /dev/ttyS1
)��
#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);
}
�Υ˥������Ͻ����⡼�ɤǤϡ����Ϥ�ԤȤ��ƤޤȤ�뤳�ȤϹԤ�줺��
���Ͻ���(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);
}
#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;
}
���ξϤϴ�ñ�˺Ѥޤ��ޤ����ҥ�Ȥ����Ȥ���Ū�ʤΤǡ�����ץ�Υץ� ������û����Τˤ��Ƥ��ޤ������λ��Ȥϥ��ꥢ��ݡ��Ȥ����Ǥʤ������� �Υե�����ǥ�����ץ��ν�����Ф��ƻȤ����Ȥ��Ǥ��ޤ���
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
��¨�¤˵���
�Ƥ��ޤ���