RS232 echo 통신소스

2015. 3. 31. 18:12네트워크/RS232 통신

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <sys/types.h>

#include <termios.h>

#include <fcntl.h>


#define BUFSIZE 1024


int main( void)

{

   char buf_rcv[BUFSIZE];

   //수신한 데이터를 저장할 버퍼 변수


   int fd;

   /*통신 포트를 파일 개념으로 사용하기 위한 디스크립터 입니다. 

     이 파일 디스크립터를 이용하여 표준 입출력 함수를 이용할 수 있습니다. */ 


   struct termios newtio;

   /* baud(통신속도) stop bit 크기 등의 시리얼 통신 환경을 설정하기 위해 termios 구조체를 선언했습니다. */


   fd = open( "/dev/ttyS0", O_RDWR ¦ O_NOCTTY ¦ O_NONBLOCK );


   // /dev/ttyS0를 사용하기 위해 open()함수를 사용합니다.

   // O_RDWR은 파일 디스크립터인 fd를 읽기와 쓰기 모드로 열기 위해 지정

   // O_NOCCTY와 O_NONBLOCK는 시리얼 통신 장치에 맞추어 추가했습니다.


   memset( &newtio, 0, sizeof(newtio) );


   // 시리얼 통신환경 설정을 위한 구조체 변수 newtio 값을 0 바이트로 깨끗이 채웁니다. 


   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 );   // 포트에 대한 통신 환경을 설정합니다. 


   memset(buf_rcv,0,sizeof(buf_rcv)); // buf_rcv를 초기화


   read(fd,buf_rcv,BUFSIZE+1); //buf_rcv에 데이터를 수신

   write( fd, buf_rcv, BUFSIZE);

   // 수신한 데이터를 저장한 buf_rcv를 송신

   

   close( fd);

   // 통신 포트를 닫아 사용을 중지합니다. 

   

   return 0; 

}


O_NOCTTY : open을 하려는 process에 대해 device를 controlling terminal로 할당하지 말라 는 것 controlling terminal이란  device가 현재 terminal을 제어함을 의미한다Serial 통신에서는 데이터 전송 시에 <CTRL>-C 문자가 오면 프로그램이 종료되지 않도록 하기 위해 controlling tty가 안되도록 한다.(O_NOCTTY)


'네트워크 > RS232 통신' 카테고리의 다른 글

통신 제어 문자표  (0) 2016.08.10
시리얼 통신 기초  (0) 2015.04.08