티스토리 뷰
목차
시리얼 통신, 폴링 소스 [C++ Serial COM Poll 예제]
제목 그대로 시리얼 통신을 위한 폴링(Poll) 소스입니다. C++ 시리얼 통신에서 Poll이란 의미는 자료 수신에 흔히 사용하는데, 여기서도 시리얼 통신, 수신 시 응용 소스를 소개합니다. C++ 시리얼 통신에서 Poll은 송신에도 자주 사용하기에 원활한 송수신을 위해 기본적인 Poll 기능은 이해하시는 게 좋습니다.
시리얼 통신, 폴링 소스 [C++ Serial COM Poll 예제]
아래부터 C++ 시리얼 통신 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, 0, sizeof(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++ 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 예제]