티스토리 뷰

목차

    시리얼 통신, 폴링 소스 [C++ Serial COM Poll 예제]


    제목 그대로 시리얼 통신을 위한 폴링(Poll) 소스입니다. C++ 시리얼 통신에서 Poll이란 의미는 자료 수신에 흔히 사용하는데, 여기서도 시리얼 통신, 수신 시 응용 소스를 소개합니다. C++ 시리얼 통신에서 Poll은 송신에도 자주 사용하기에 원활한 송수신을 위해 기본적인 Poll 기능은 이해하시는 게 좋습니다.


    시리얼 통신, 폴링 소스 [C++ Poll 예제]시리얼 통신, 폴링 소스 [C++ Serial COM Poll 예제]


    아래부터 C++ 시리얼 통신 Poll 예제 소스 소개합니다.



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/poll.h>
    #include <termios.h>                   // B115200, CS8 등 상수 정의
    #include <fcntl.h>                     // O_RDWR , O_NOCTTY 등의 상수 정의
     
    int main( void)
    {        
       int    fd;
       int    ndx;
       int    cnt;
       char   buf[1024];
       struct termios    newtio;
       struct pollfd     poll_events;      // 체크할 event 정보를 갖는 struct
       int    poll_state;
     
       // 시리얼 통신 포트를 open
     
       fd = open( "/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK );  // 디바이스를 open 한다.
       if ( 0 > fd)
       {        
          printf("open error\n");
          return -1;
       }
     
       // 시리얼 통신 포트 통신 환경 설정
     
       memset( &newtio, 0sizeof(newtio) );
       newtio.c_cflag       = B115200 | CS8 | CLOCAL | CREAD;
       newtio.c_oflag       = 0;
       newtio.c_lflag       = 0;
       newtio.c_cc[VTIME]   = 0;
       newtio.c_cc[VMIN]    = 1;
       
       tcflush  (fd, TCIFLUSH );
       tcsetattr(fd, TCSANOW, &newtio );
       fcntl(fd, F_SETFL, FNDELAY); 
     
     
       // poll 사용을 위한 준비
       
       poll_events.fd        = fd;
       poll_events.events    = POLLIN | POLLERR;          // 수신된 자료가 있는지, 에러가 있는지
       poll_events.revents   = 0;
     
     
       // 시리얼 통신, 자료 송수신
     
       while ( 1)
       {
          poll_state = poll(                // Poll()을 호출하여 event 발생 여부 확인     
                             (struct pollfd*)&poll_events, // event 등록 변수
                                                       1,  // 체크할 pollfd 개수
                                                    1000   // time out 시간
                           );
     
          if ( 0 < poll_state)                             // 발생한 시리얼 통신 event
          {     
             if ( poll_events.revents & POLLIN)            // event 가 자료 수신?
             {
                cnt = read( fd, buf, 1024);
                write( fd, buf, cnt);
                printf"data received - %d %s\n", cnt, buf);
             }
             if ( poll_events.revents & POLLERR)      // event 가 에러?
             {
                printf"시리얼 통신 라인에 에러가 발생, 프로그램 종료");
                break;
             }
          }
       }
       close( fd);
       return 0;
    }
    cs


    전체적인 소스는 위에 언급되었고 소스 전체에 대한 설명은 참조 사이트를 방문해서 읽어보세요. 아래는 참조 사이트에서 꼭 필요한 부분만 발췌합니다.


    시리얼 통신 C++시리얼 통신, 폴링 소스 [C++ Serial COM Poll 예제]


    C++ 시리얼 통신 예제를 보시면 struct pollfd를 사용했습니다. struct pollfd의 내용을 보면 아래와 같습니다.


    1
    2
    3
    4
    5
    6
    struct pollfd 
    {
      int fd;        // 대상 파일 디스크립터 
      short events;  // 발생된 이벤트 
      short revents; // 돌려받은 이벤트 
    };
    cs


    fd는 감시 대상인 디스크립터, 즉 핸들이 되겠습니다. events는 체크하고 싶은 event의 모음입니다. 여기서 체크가 가능한 것은 아래와 같습니다.


    1
    2
    3
    4
    5
    6
    7
    #define POLLIN 0x0001 // 읽을 데이터가 있다.
    #define POLLPRI 0x0002 // 긴급한 읽을 데이타가 있다.
    #define POLLOUT 0x0004 // 쓰기가 봉쇄(block)가 아니다.
    #define POLLERR 0x0008 // 에러발생
    #define POLLHUP 0x0010 // 연결이 끊겼음
    #define POLLNVAL 0x0020 
    // 파일지시자가 열리지 않은 것 같은, Invalid request (잘못된 요청)
    cs


    revents는 C++ 시리얼 통신 event 발생 여부를 bit 별로 갖는 값입니다.


    시리얼 통신, 폴링 소스 [C++ Serial COM Poll 예제]