1. 개요


      이문서는 ESP-NS보드에서 RS485통신이나 모뎀 제어시에 사용되는 RTS 제어에 대한 소스의 예를 보여주는 문서입니다.

   2. RS485


     통신을 하기위한 방법을 소개하기전에 프로그램하는데 있어 필요한 485의 내용을 간단한 얘기를 하겠습니다. 자세
     한 하드웨어적인 스펙은 다른 자료를 참조하시기 바랍니다. 우선 RS485는 D- 와 D+ 두선이 있으며, RS232C와 다르
     게 RX, TX가 없이 수신이나 수신을  할때 두선을 같이 사용합니다. 두선의 전압 차로서 신호를 전달 하게 되어있는
     방식입니다. 다시 조금 정리하면 통신선로가 하나이기 때문에 하드웨어적으로 송신을 할때를 제외하고는 항상 수상태
     이어야 합니다. 송신 또는 수신을 설정하는 하드웨어 핀을 우리는 RTS핀을 사용할것입니다.
     여기서 중요한건 RTS 입니다. ^^ ESP-NS 보드는 ioctl( fd, 0x54F0, 0x0001 );를 호출하면서 RS232C때 와 같이 사
     용하면 자동으로 제어가 되어지게 되어있다.

   3. 조건


      이 소스는 ESP-NS를 대상으로한 예입니다.
      ESP-NS보드는 485/232 겸용 포트가 ttyS00 ~ 03 까지 4개있습니다.( 메뉴얼 참조 )
      RS232C 통신을 먼저 해보시면 좋습니다. ^^

   4. 소스

     #include <stdio.h>
     #include <stdlib.h>
     #include <unistd.h>
     #include <sys/types.h>
     #include <sys/stat.h>
     #include <sys/ioctl.h>
     #include <fcntl.h>
     #include <linux/types.h>
     #include <linux/serial.h>
     #include <termios.h>
     #include <sys/signal.h>
     #include <sys/types.h>
    
     int     main( int argc, char **argv )
     {
         int fd,c, res;
        
         char buf[255];
         struct termios oldtio,newtio;
         int modemctlline;
         int txemptystate;
         char *dev_name;
         char wr_rd;
    
             // arg 받기.
             dev_name = argv[1];
             wr_rd         = argv[2][0];
    
    
    
         // 시리얼 장치를 연다. ------------------------------------------------------------
         fd = open( dev_name, O_RDWR | O_NOCTTY );
         if (fd <0)
         {
                 // 화일 열기 실패
                 printf( "Device OPEN FAILn");
                 return -1;
         }
    
         // 통신 환경를 설정한다.  
    
         tcgetattr(fd,&oldtio); // 현재 설정을 oldtio에 저장
         memset(&newtio, 0, sizeof(newtio));
         newtio.c_cflag = B9600 | CS8 | CLOCAL | CREAD ;
         newtio.c_iflag = IGNPAR;
         newtio.c_oflag = 0;
    
         // set input mode (non-canonical, no echo,...)
    
         newtio.c_lflag = 0;    
    
         // 다음 두라인은 통신 방식에 따라서 다르게 설정하여야 한다.
    
         newtio.c_cc[VTIME]    = 0;   // 문자 사이의 timer를 disable
         newtio.c_cc[VMIN]     = 5;   // 최소 5 문자 받을 때까진 blocking
        

        // RS485 설정. ---------------------------------------------
         ioctl( fd, 0x54F0, 0x0001 );
        // ---------------------------------------------------------

         tcflush(fd, TCIFLUSH);
         tcsetattr(fd,TCSANOW,&newtio);
    
             //  ------------------------------------------------------------------------- End
    
    
    
             if( wr_rd == 'w' || wr_rd == 'W')                // 485 쓰기. ----------------------------
             {
                  // 데이타를 출력한다.
                  memset( buf, 'A', 32 ); buf[32]=0;
                  write( fd, buf, 32 );
                  printf( "DATA : [ %s ]n", buf);                                
    
                   // 잠시 대기한다.
                  sleep(1);
                  close( fd );        
             }
             else
             {                                                               // 485 읽기. ----------------------------
                   // 데이타를 읽는다.
                  res = read(fd,buf,255);  
                  buf[res]=0;
                  printf("%s:%dn", buf, res);                  
    
                   // 통신상태를 원 위치한다.            
                  tcsetattr(fd,TCSANOW,&oldtio);
                  close( fd );
             }
     }
      
        5. 실행
     1. ttyS00 과 ttyS01 의 D-끼리, D+끼리 연결 해줍니다.
     2. 위와 같이 test_485.c를 작성합니다. 컴파일 합니다.
         ... #]arm-linux-gcc test_485.c -o test_485
     3. test_485를 보드에서 실행합니다.
         ... #]./test_485 ttyS00
    
    
    
태그: *시리얼 *485 *네트워크