miniterm.c 실행법좀 알려주세요.
글쓴이: jinushun / 작성시간: 목, 2003/08/07 - 1:40오후
시리얼통신을 해보고있습니다.
초보라 어렵군요.
코드에 대해 질문이 있어서요..
아래가 코드입니다.
/* * AUTHOR: Sven Goldt (goldt@math.tu-berlin.de) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ /* This is like all programs in the Linux Programmer's Guide meant as a simple practical demonstration. It can be used as a base for a real terminal program. */ #include <termios.h> #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <sys/signal.h> #define BAUDRATE B38400 #define MODEMDEVICE "/dev/modem" #define ENDMINITERM 2 /* ctrl-b to quit miniterm */ #define _POSIX_SOURCE 1 /* POSIX compliant source */ #define FALSE 0 #define TRUE 1 volatile int STOP=FALSE; void child_handler(int s) { STOP=TRUE; } main() { int fd,c; struct termios oldtio,newtio,oldstdtio,newstdtio; struct sigaction sa; /* Open modem device for reading and writing and not as controlling tty because we don't want to get killed if linenoise sends CTRL-C. */ fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY); if (fd <0) {perror(MODEMDEVICE); exit(-1); } tcgetattr(fd,&oldtio); /* save current modem settings */ /* Set bps rate and hardware flow control and 8n1 (8bit,no parity,1 stopbit). Also don't hangup automatically and ignore modem status. Finally enable receiving characters. */ newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD; /* Ignore bytes with parity errors and make terminal raw and dumb. */ newtio.c_iflag = IGNPAR; /* Raw output. */ newtio.c_oflag = 0; /* Don't echo characters because if you connect to a host it or your modem will echo characters for you. Don't generate signals. */ newtio.c_lflag = 0; /* blocking read until 1 char arrives */ newtio.c_cc[VMIN]=1; newtio.c_cc[VTIME]=0; /* now clean the modem line and activate the settings for modem */ tcflush(fd, TCIFLUSH); tcsetattr(fd,TCSANOW,&newtio); /* Strange, but if you uncomment this command miniterm will not work even if you stop canonical mode for stdout. This is a linux bug. */ tcsetattr(1,TCSANOW,&newtio); /* stdout settings like modem settings */ /* next stop echo and buffering for stdin */ tcgetattr(0,&oldstdtio); tcgetattr(0,&newstdtio); /* get working stdtio */ newstdtio.c_lflag &= ~(ICANON | ECHO); tcsetattr(0,TCSANOW,&newstdtio); /* terminal settings done, now handle in/ouput */ switch (fork()) { case 0: /* child */ /* user input */ close(1); /* stdout not needed */ for (c=getchar(); c!= ENDMINITERM ; c=getchar()) write(fd,&c,1); tcsetattr(fd,TCSANOW,&oldtio); /* restore old modem setings */ tcsetattr(0,TCSANOW,&oldstdtio); /* restore old tty setings */ close(fd); exit(0); /* will send a SIGCHLD to the parent */ break; case -1: perror("fork"); tcsetattr(fd,TCSANOW,&oldtio); close(fd); exit(-1); default: /* parent */ close(0); /* stdin not needed */ sa.sa_handler = child_handler; sa.sa_flags = 0; sigaction(SIGCHLD,&sa,NULL); /* handle dying child */ while (STOP==FALSE) /* modem input handler */ { read(fd,&c,1); /* modem */ write(1,&c,1); /* stdout */ } wait(NULL); /* wait for child to die or it will become a zombie */ break; } }
나머지야 책뒤져서 보고 이해할려고하는데. 아래코드는..
#define ENDMINITERM 2 /* ctrl-b to quit miniterm */
도무지 이해안되네요.
실행을 해보니 실제로 콘트롤 B 키를 입력하니 중단이 되던데
어떻게 해서 그렇게 되는것입니까.
설명좀해주시면 감사하겠습니다.
Forums:
[quote]#define ENDMINITERM 2 /* ctrl-b t
키보드로 제어문자(ASCII Code : 1~31)를 입력하는 방법은 Ctrl키와 같이 눌러서 입력할 수 있습니다.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
[code:1]for (c=getchar(); c!
for문의 아주 좋은 예이네요...
There is no spoon. Neo from the Matrix 1999.
답변 감사드립니다. ^^
답변 감사드립니다. ^^
----------------------------
www.nate.com
----------------------------
댓글 달기