본문 바로가기
C++ 200제/코딩 IT 정보

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

by vicddory 2017. 12. 9.

시리얼 통신, 폴링 소스 [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 예제]

댓글