하드웨어
C221-S3C6401 보드는 사용자들이 많이 사용하는 통신관련 디바이스들을 모아 놓은 보드입니다.
http://forum.falinux.com/zbxe/?document_srl=563538 에서 C221-S3C6401 보드 관련 내용을 소개하였습니다.
C221-S3C6410 보드의 활용 방법을 올려 보도록 노력해 보겠습니다.
이번 주는 C221-S3C6401 보드의 간단한 RS232 통신 테스트를 설명하도록 하겠습니다.
위의 그림[1] 과 그림 [2] 에서 빨강색 네모상자 부분을 아래와 같이 연결하면 됩니다.
위와 같이 연결하였다면 C221-S3C6410 보드간의 RS232 통신을 주고 받는 프로그램을 아래와 같이 작성합니다.
C221-S3C6410 보드의 시리얼 통신은 ttySAC3 의 장치파일을 사용하면 됩니다.
[ sender 프로그램 ]
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <termios.h> #include <fcntl.h> int main( int argc, char *argv[]) { int fd; struct termios newtio; if ( 2 > argc){ printf( "인수가 모자릅니다. 시리얼 포트를 입력하여 주시오\n"); printf( "실행방법: ]$ ./app_rs232 /dev/ttyS0\n"); exit( 0); } fd = open( argv[1], O_RDWR | O_NOCTTY | O_NONBLOCK); memset( &newtio, 0, sizeof(newtio) ); newtio.c_cflag = B115200; // 통신 속도 115200 newtio.c_cflag |= CS8; // 데이터 비트가 8bit newtio.c_cflag |= CLOCAL; // 외부 모뎀을 사용하지 않고 내부 통신 포트 사용 newtio.c_cflag |= CREAD; // 쓰기는 기본, 읽기도 가능하게 newtio.c_iflag = 0; // parity 비트는 없음 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 ); // 포트에 대한 통신 환경을 설정합니다. write( fd, "forum.falinux.com", 17); // 표준 입출력 함수를 이용하여 시리얼 포트로 17자의 문자열을 전송합니다. sleep( 1); // receiver가 자료를 수신할 수 있도록 대기 close( fd); // 통신 포트를 닫아 사용을 중지합니다. return 0; } |
간단한 RS232 전송 프로그램입니다. 통신속도 : 115200bps, 데이터비트 8bit, 패리티 : 없음, 정지비트 : 1 로 전송합니다.
프로그램을 실행하면 write() 함수를 통하여 forum.falinux.com 문자열을 한번 전송합니다.
[ receiver 프로그램 ]
#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( int argc, char *argv[]) { int fd; int ndx; int cnt; char buf[1024]; struct termios newtio; struct pollfd poll_events; // 체크할 event 정보를 갖는 struct int poll_state; if ( 2 > argc){ printf( "인수가 모자릅니다. 시리얼 포트를 입력하여 주시오\n"); printf( "실행방법: ]$ ./app_rs232 /dev/ttyS0\n"); exit( 0); } // 시리얼 포트를 open fd = open( argv[1], 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); buf[cnt] = '\0'; printf( "data received - %d %s\n", cnt, buf); } if ( poll_events.revents & POLLERR) // event 가 에러? { printf( "통신 라인에 에러가 발생, 프로그램 종료"); break; } } } close( fd); return 0; } |
위의 전송데이타를 받기위해 통신속도 : 115200bps, 데이터비트 8bit, 패리티 : 없음, 정지비트 : 1 로 설정합니다.
poll 이벤트가 발생하면 read() 함수를 통하여 데이터를 수신하는 함수입니다.
[ 실행 방법 ]
그림[1]의 보드는 수신(receiver) 보드로 사용하고 다음과 같이 프로그램을 실행합니다.
$ ./app_rs232_receiver /dev/ttySAC3 |
그림[2]의 보드는 송신(send) 보드로 사용하고 다음과 같이 프로그램을 실행합니다.
$ ./app_rs232_sender /dev/ttySAC3 |
---------------------
그림 [ 2 ] 에서 프로그램을 실행할때 마다 한번씩 그림 [ 1 ] 보드에서 forum.falinux.com 문자열을 수신하게 됩니다.
---------------------
===========
위의 소스 및 실행 프로그램은 C221-S3C6410 보드를 구매하시면 제공되는 소스들입니다.
다음 강좌에서는 그림[ 1 ] 과 그림 [ 2 ] 의 RS485 통신을 소개하도록 하겠습니다.