C221-S3C6401 보드는 사용자들이 많이 사용하는 통신관련 디바이스들을 모아 놓은 보드입니다.

http://forum.falinux.com/zbxe/?document_srl=563538 에서 C221-S3C6401 보드 관련 내용을  소개하였습니다.


C221-S3C6410 보드의 활용 방법을 올려 보도록 노력해 보겠습니다.


이번 주는 C221-S3C6401 보드의 간단한 RS232 통신 테스트를 설명하도록 하겠습니다.



RS232통신.jpg


위의 그림[1] 과 그림 [2] 에서 빨강색 네모상자 부분을 아래와 같이 연결하면 됩니다.


연결.jpg


위와 같이 연결하였다면 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 통신을 소개하도록 하겠습니다.