  The Linux Serial Programming HOWTO

   ø α׷ Ͽ
  Peter H. Baumann, Peter.Baumann@dir.de
  v1.0, 22 January 1998
  , schun@crypto.pe.kr
  2000 2 24

     ýۿ ø   α׷ϴ°
  ϴ Ͽ ̴.
  ______________________________________________________________________

  

  1. Ұ
     1.1 ۱
     1.2   ֽ 
     1.3 Feedback

  2. ϱ
     2.1 
     2.2 Ʈ 
     2.3 ø ġ Է 
        2.3.1 Canonical Է ó(Canonical Input Processing)
        2.3.2 Non-Canonical Է ó(Non-Canonical Input Processing)
        2.3.3 񵿱 Է
        2.3.4 Էġ Ƽ÷

  3. α׷ 
     3.1 Canonical Է ó(Canonical Input Processing)
     3.2 Non-Canonical Է ó(Non-Canonical Input Processing)
     3.3 񵿱 Է
     3.4 Է ġ Ƽ÷

  4. ٸ  
  5. ⿩ 

  ______________________________________________________________________

  1.  Ұ

     ýۿ ø   α׷ϴ°
  ϴ Ͽ ̴. پ ø  α׷ (Canonical
  I/O, 񵿱 I/O, I/O Ƽ÷) Ѵ.

  ø Ʈ ¾ϴ  ؼ Greg Hankins Serial-HOWTO
   о ٶ.

    о  ƴ  д. ׷ Ʈ ϸ鼭
   鿡 ε.   Ұ ڵ  LDP(Linux
  Document Project) α׷
  ̵(ftp://sunsite.unc.edu/pub/Linux/docs/LDP/programmers-
  guide/lpg-0.4.tar.gz  ̷ Ʈ)   ִ miniterm
  code ٰϿ .

  1997 6   ۼ ڿ   䱸  Win NT
  ȯ ű Ǿ  ̻     . 
  ĿƮ    ϴµ Ⲩ Ȱϰڴ.(Feedback
  κ  )       ð Ͱų version UP
  Ѵٸ e-mail ֱ ٶ.

      i386 Linux Kernel 2.0.29 ׽Ʈ Ͽ.

  1.1.  ۱

  The Linux Serial-Programming-HOWTO is copyright (C) 1997 by Peter
  Baumann. Linux HOWTO documents may be reproduced and distributed in
  whole or in part, in any medium physical or electronic, as long as
  this copyright notice si retained on all copies. Commercial
  redistribution is allowed and encouraged; however, the author would
  like to be notified of any such distributions.

  All translations, derivative works, or aggregate works incorporating
  any Linux HOWTO documents must be covered under this copyright notice.
  That is, you may not produce a derivative work from a HOWTO and impose
  additional restrictions on its distribution. Exceptions to thes rules
  may be granted under certain conditions; please contact the Linux
  HOWTO coordinator at the address given below.

  In short, we wish to promote dissemination of this information through
  as many channels as possible. However, we do wish to retain copyright
  on the HOWTO documents, and would like to be notified of any plans to
  redistribute the HOWTOs.

  If you have questions, please contact Tim Bynum, the Linux HOWTO
  coordinator, at linux-howto@sunsite.unc.edu via email.

  1.2.    ֽ 

    ֽ 
  ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/Serial-Programming-HOWTO 
  ̷ Ʈ ã  ִ. PostScript  DVI  ٸ ˵
   ִ 丮 ִ.  http://sunsite.unc.edu/LDP/HOWTO/Serial-
  Programming-HOWTO.html    , comp.os.linux.answers
  Ŵ   ̴.

  1.3.  Feedback

  , , ĿƮ, ǻ̳   ߰  ִٸ ˷ֱ
  ٶ.  HOWTO  Ʈ ϱ⸦ Ѵ.  Ȯ
   ϴ κ ְų  Ȯؾ  κ ִٸ ˷.
   e-mail ּҴ Peter.Baumann@dir.de ̴.    e-mail
       ˷.    1.0̴.

  2.  ϱ

  2.1.  

  ڵ带 ϴ     ϳ  ڽ ¾ϰ 
   ڽ null-modem ̺ ϴ ̴. Miniterm α׷
  ̿Ͽ ڵ غ. Miniterm ϱ⵵ , Ű忡
  ԷµǴ ڵ(Ư ) ø Ʈ   ִ.
    üũؾ  

  #define MODEMDEVICE "/dev/ttyS0"

    Ǿ ִ° ϴ ̴. COM1 ߷
  /dev/ttyS0, COM2 Ϸ /dev/ttyS1 Ѵ.  ׽  
   ߿  ڰ ø Ʈ µ  Ͱ  
  ó(output processing)  ʰ ״(raw)  Ǵ°
  Ȯϴ ̴. ׽Ʈ   .    ڽ
   miniterm α׷ Ű Ű带 ĺ.  
  Ÿ ڰ ٸ  ״ Ÿ  ȮѴ.

  Null-modem ̺ TxD RxD  cross  Ǿ Ѵ. 
  𸣰 Serial-HOWTO  7 .

   ׽Ʈ   ǻ͸  ϴ.   ִ ø
  Ʈ   ִٸ ̺  ø Ʈ ϰ miniterm
    Ͽ ׽Ʈϸ ȴ.

  2.2.  Ʈ 

  ġ  /dev/ttyS*  ͹̳ ϱ  
  ȴ.   ø  α׷ ϴµ ݵ ؾ 
  ̴.  , ø Ʈ  ڸ ϵ Ǿ ִ.
      ۽ÿ ٲ  ̴.  ( : ø
  ġ ϵ ͹̳ ġ зǱ  ʱ  Ϲ ͹̳ο
  Ǵ ڰ ǵ Ǿ ִ ̴.)

   Ķ͵ α׷ ڵ忡    ִ. Ķ͵
  <asm/termbits.h> ǵǾ ִ struct termios ü Ǿ
  ִ.

         #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 */
         };

     flag ϰ ִ. c_iflag(Է  flag) 
  Է ó(input processing) Ѵ.  Է ó read() Լ
   ø Ʈ  ͸ read  б  ͵
  c_iflag   óϴ  ǸѴ. c_oflag( 
  flag)  ó(output processing) ϴ  Ѵ.
  c_cflag(  flag) baudrate, data bits, stop bits  Ʈ
   Ѵ. c_lflag(local  flag) echo   
  Ѵ.  c_cc( ) 迭 EOF(End of File), STOP
    ۵  ڷ  ΰ Ѵ.  
  Ʈ ڴ <asm/termios.h> ǵǾ ִ.  flag鿡  
  termios(3) man page ִ. termios ü c_line ׸ POSIX
  ȣȯ ýۿ  ʴ´.

  2.3.  ø ġ Է 

   ǿ   Է  ϱ Ѵ.  о߿
   ˸  ؾ Ѵ.  ھ д   ü
  ڿ ޴  ϴٸ ؾ Ѵ.  ̷  
  , ڸ Ҿ 찡  ݸ, ü ڿ ѹ  
   ߻ ʾҴ.

  2.3.1.  Canonical Է ó(Canonical Input Processing)

  Canonical Է ó ͹̳ ⺻ ó ̴.    
   óϴ ٸ α׷ ϴµ   ִ.   
  Ʈ NL(New Line, ASCII LF) , EOF(End of File) , Ȥ
  EOL(End of Line)  Ǵ ڿ ǹѴ. CR(Carriage
  Return, DOS/Windows Ʈ EOL ) ڴ Ʈ ÿ 
    ڷ νĵ ʴ´.

   Canonical Է ó 忡 ERASE, DELETE WORD, REPRINT
  CHARACTERS ڵ ó  ְ, CR ڸ NL ڷ ȯ ó 
   ִ.

  2.3.2.  Non-Canonical Է ó(Non-Canonical Input Processing)

  Non-Canonical Է ó 忡      ũ
  ڸ о  ִ.  Ÿ̸Ӹ ξ  ð read()
   ʴ      ִ.   ׻ 
  ũ ڵ鸸 оų 뷮 ڵ ϰ  
  Ѵ.

  2.3.3.  񵿱 Է

        ̳ 񵿱   
  ִ.   read    blockǴ μ
  Ʈ Ǿ ִ. 񵿱 Ŀ read() Լ ٷ ϵǸ,
  ȣ α׷ signal .  signal signal handler(ñ׳
  ó Լ) .

  2.3.4.  Էġ Ƽ÷

    Է 忡 ش    ġ ٷ
    ϴ.     α׷ TCP/IP ϰ ø
  ſ ÿ Է ޾ƾ ߴ. Ʒ 3.4    
  ٸ ġκ ÿ Է ٸ ڵ̴.    
  ġ Է  ó ϰ  ٽ ο Է  
  ٸ.

  Ʒ 3.4     ,  multi-processing
  OS ˰ ֱ⿡ ſ ߿ϴ. select() ý ȣ Լ Է
  ٸ  CPU ϸ  ʴ´. ݸ Է Դ 
  鼭 üũϴ polling  ýۿ ϸ ְ Ǿ ٸ
  μ  ӵ ϽŰ ȴ.

  3.  α׷ 

     miniterm.c Դ. Canonical Է ó
  ó  ִ ִ  ڴ 255(<linux/limits.h> Ȥ
  <posix1_lim.h> ǵ) μ  ִ ̴ 255 ѵȴ.

   Է ó     ϸ ڵ  comment
  ϶.  ڵ尡 ϱ ⸦ ٶ. Canonical Է ó 
   comment   سҴ. ٸ  canonical  
  ٸ κп comment ޾Ҵ.

   Ϻ ,    ׽Ʈ غ 
  α׷     ã   ̴.

  ø Ʈ ġ    ߴ° ٽ   Ȯϰ,
    㰡  Ǿ ִ ⸦ ٶ.  (: chmod a+rw
  /dev/ttyS1)

  3.1.  Canonical Է ó(Canonical Input Processing)

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

    /* Baudrate  <asm/termbits.h> ǵǾ ִ.
    /* <asm/termbits.h> <termios.h> includeȴ. */
    #define BAUDRATE B38400
    /*  Ʈ ġ  ٲ۴. COM1="/dev/ttyS1, COM2="/dev/ttyS2 */
    #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];

    /* б/   ġ .(O_RDWR)
         ÿ <CTRL>-C ڰ  α׷  ʵ
       ϱ  controlling tty ȵǵ Ѵ.(O_NOCTTY)
    */
     fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
     if (fd <0) {perror(MODEMDEVICE); exit(-1); }

     tcgetattr(fd,&oldtio); /* save current serial port settings */
     bzero(&newtio, sizeof(newtio)); /* clear struct for new port settings */

    /*
      BAUDRATE:  ӵ. cfsetispeed()  cfsetospeed() Լε  
      CRTSCTS : ϵ 帧 . (ø ̺  ɿ Ǿ ִ
                츸 ϵ Ѵ. Serial-HOWTO 7  .)
      CS8     : 8N1 (8bit, no parity, 1 stopbit)
      CLOCAL  : Local connection.    ʴ´.
      CREAD   :   ϰ Ѵ.
    */
     newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;

    /*
     IGNPAR   : Parity  ִ  Ʈ Ѵ.
     ICRNL    : CR ڸ NL ڷ ȯ óѴ. (  ϸ ٸ
                ǻʹ CR ڸ   Ṯڷ ν   ִ.)
      otherwise make device raw (no other input processing)
    */
     newtio.c_iflag = IGNPAR | ICRNL;

    /*
     Raw output.
    */
     newtio.c_oflag = 0;

     ICANON   : canonical Է ϰ Ѵ.
      disable all echo functionality, and don't send signals to calling program
    */
     newtio.c_lflag = ICANON;

    /*
        ڵ ʱȭѴ.
      Ʈ  <termios.h>  Ͽ ã  ִ.  comment
      ߰ ޾ƳҴ.
    */
     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;     /* inter-character timer unused */
     newtio.c_cc[VMIN]     = 1;     /* blocking read until 1 character arrives */
     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' */

    /*
       modem  ʱȭϰ Ʈ  ģ.
    */
     tcflush(fd, TCIFLUSH);
     tcsetattr(fd,TCSANOW,&newtio);

    /*
      ͹̳  ,  Է óѴ.
           ù ڸ 'z'   α׷
      Ѵ.
    */

     while (STOP==FALSE) {     /*  (STOP==TRUE)    */
     /* read()   ڰ   255 ڸ Ѿ
        block ȴ. read ϰ ϴ   Է   
         쿡  ѹ read Ͽ  о  ִ.
        res read ؼ      ȴ. */

        res = read(fd,buf,255);
        buf[res]=0;             /* set end of string, so we can printf */
        printf(":%s:%d\n", buf, res);
        if (buf[0]=='z') STOP=TRUE;
     }
     /* restore the old port settings */
     tcsetattr(fd,TCSANOW,&oldtio);
    }

  3.2.  Non-Canonical Է ó(Non-Canonical Input Processing)

  Non-Canonical Է ó 忡 Է    ó
  ʴ´.  erase, kill, delete  Է ó  ʴ´. 
  忡 ϴ Ķʹ c_cc[VTIME] c_cc[VMIN]  ̴.
  c_cc[VTIME] Ÿ̸ ð ϰ, c_cc[VMIN] read 
  ϵǱ  ּ   Ѵ.

     MIN > 0, TIME = 0
        MIN read ϵǱ  ּ  .  TIME 0̸
        Ÿ̸Ӵ  ʴ´.(Ѵ ٸ.)

     MIN = 0, TIME > 0
        TIME time-out  ȴ. Time-out  TIME * 0.1
        ̴. Time-out Ͼ   ڶ  read
        ϵȴ.

     MIN > 0, TIME > 0
        TIME time-out ƴ inter-character Ÿ̸ӷ Ѵ. ּ
        MIN  ڰ ų    ð TIME 
         ϵȴ.  ڰ ó   Ÿ̸Ӵ  ϰ
         ڰ   ۵ȴ.

     MIN = 0, TIME = 0
        read  ϵȴ.    ִ   û
          ȯȴ. Antonino ϸ readϱ 
        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 compliant source */
         #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); /*   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;   /*   timer disable */
          newtio.c_cc[VMIN]     = 5;   /* ּ 5    blocking */

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

          while (STOP==FALSE) {       /* loop for input */
            res = read(fd,buf,255);   /* ּ 5 ڸ   */
            buf[res]=0;               /* '\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 compliant source */
    #define FALSE 0
    #define TRUE 1

    volatile int STOP=FALSE;

    void signal_handler_IO (int status);   /* signal handler Լ  */
    int wait_flag=TRUE;                    /* signal    TRUE */

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

      /* Non-blocking  ø ġ (read Լ ȣ  ﰢ ) */
      fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
      if (fd <0) {perror(MODEMDEVICE); exit(-1); }

      /* install the signal handler before making the device asynchronous */
      /* ġ 񵿱    signal handler */
      saio.sa_handler = signal_handler_IO;
      saio.sa_mask = 0;
      saio.sa_flags = 0;
      saio.sa_restorer = NULL;
      sigaction(SIGIO,&saio,NULL);

      /* SIGIO signal   ֵ Ѵ. */
      fcntl(fd, F_SETOWN, getpid());
      /* file descriptor 񵿱 . (manual page 
         O_APPEND  O_NONBLOCK F_SETFL   ִٰ Ǿ ִ.) */
      fcntl(fd, F_SETFL, FASYNC);

      tcgetattr(fd,&oldtio); /* save current port settings */
      /* canonical Էó  Ʈ  */
      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);

      /* loop while waiting for input. normally we would do something
         useful here */
      while (STOP==FALSE) {
        printf(".\n");usleep(100000);
        /* after receiving SIGIO, wait_flag = FALSE, input is available
           and can be read */
        if (wait_flag==FALSE) {
          res = read(fd,buf,255);
          buf[res]=0;
          printf(":%s:%d\n", buf, res);
          if (res==1) STOP=TRUE; /* stop loop if only a CR was input */
          wait_flag = TRUE;      /* wait for new input */
        }
      }
      /* restore old port settings */
      tcsetattr(fd,TCSANOW,&oldtio);
    }

    /***************************************************************************
    * signal handler. sets wait_flag to FALSE, to indicate above loop that     *
    * characters have been received.                                           *
    ***************************************************************************/

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

  3.4.  Է ġ Ƽ÷

      ϰڴ.  ϴ   
  Ʈ ֱ  ̹Ƿ ª  ڵ常 Ҵ.  
  ø Ʈ Ǵ  ƴ϶ file descriptor ϴ 
  ¿   ִ.

  select() ý ȣ Լ شϴ ũ Լ fd_set
  Ѵ. fd_set bit arrayμ file descriptor bit entry
  ۿѴ.  select() شϴ file descriptor bit 
  fd_set Է Ķͷ ޾Ƽ Է,  Ȥ  ߻ Ͼ
   Ѵ. fd_set FD_ ϴ ũ Լ ؼ
  Ѵ.  select(2) man page ϶.

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

    main()
    {
       int    fd1, fd2;  /* input sources 1 and 2 */
       fd_set readfs;    /* file descriptor set */
       int    maxfd;     /* maximum file desciptor used */
       int    loop=1;    /* loop while TRUE */

       /* open_input_source opens a device, sets the port correctly, and
          returns a file descriptor */
       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;  /* maximum bit entry (fd) to test */

       /* loop for input */
       while (loop) {
         FD_SET(fd1, &readfs);  /* set testing for source 1 */
         FD_SET(fd2, &readfs);  /* set testing for source 2 */
         /* block until input becomes available */
         select(maxfd, &readfs, NULL, NULL, NULL);
         if (FD_ISSET(fd1, &readfs))     /* input from source 1 available */
           handle_input_from_source1();
         if (FD_ISSET(fd2, &readfs))     /* input from source 2 available */
           handle_input_from_source2();
       }

    }

    ڵ Է    block Ǵ  ش.
  Time-out ʿϴٸ,   ٲ۴.

         int res;
         struct timeval Timeout;

         /* set timeout value within input loop */
         Timeout.tv_usec = 0;  /* milliseconds */
         Timeout.tv_sec  = 1;  /* seconds */
         res = select(maxfd, &readfs, NULL, NULL, &Timeout);
         if (res==0)
         /* number of file descriptors with input = 0, timeout occurred. */

    1 Ŀ time-out Ǵ  ش. Time-out Ͼ
  select() 0 ȯѴ. ⼭  ,  Timeout 
  select() ؼ ϱ  ٽ select() ȣѴٸ Time
  out.tv_usec Timeout.tv_sec  ٽ ؾ Ѵ.  Timeout 
  0 Ǹ time-out ߻ϰ select()  ϵȴ.

  4.  ٸ  

  o  Serial-HOWTO  ø Ʈ  ¾ϴ ϰ
     ϵ  Ѵ.
  o  Michael Sweet Serial Programming Guide for POSIX Compliant
     Operating Systems <http://www.easysw.com/~mike/serial>.   ũ
      ̰ ֽ ġ ã  .  ̰ ã   ?
       ſ   ̴.  ( : ٽ  ġ
     Ȱߴ.     ־.)

  o  termios(3) man page termios ü  flag  ǵǾ
     ִ.

  5.  ⿩ 

  1 Ұ κп ߵ,   о  ƴϴ. ׷
    ε, ٸ ̵  ޾Ƽ  ذߴ.
  Strudthoff , Michael Carter(mcarter@rocke.electro.swri.edu) 
  Peter Walternberg(p.waltenberg@karaka.chch.cri.nz)  
  Ѵ.

  Antonino Ianella(antonino@usa.net)    ۼ 
  Serial-Port-Programming Mini HOWTO .  Greg Hankins
  Antonino Mini-HOWTO    ߴ.

     SGML  Greg Hankins Serial-HOWTO Դ.
   ۿ    ֵ ֽ  е ִ.  Dave
  Pfaltzgraff(Dave_Pfaltzgraff@patapsco.com), Sean
  Lincolne(slincol@tpgi.com.au), Michael Wiedmann(mw@miwie.in-
  berlin.de), Adrey Bonar(andy@tipas.lt)  Ѵ.

