Friday, December 18, 2009

RS485 통신에서 RTS 제어


RS485 통신에서 RTS 제어 2.통신링크교환기술

2004/12/08 17:32

복사http://blog.naver.com/hjo0075/140008448006

1. 개요

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

2. RS485

RS485 통신은 전송 라인을 2 선만을 사용하는 방식이고 2선식의 특성상 송신과 수신이 동시에 이루어질 수 없습니다.

송신시에는 수신이 불가능하고 수신시에는 송신이 불가능하므로 통신상에서는 마스터와 슬레이브 개념을 사용하여

마스터가 송신을 하고 이에 대한 수신을 처리하는 방식으로 프로그램을 하고있습니다.

하드웨어는 송신시에 송신 드라이버를 열고 그외에는 송신 드라이버를 닫습니다.

또한 송신 드라이버를 열었을때는 수신 드라이버를 닫으며 수신 드라이버를 열때는 송신 드라이버를 닫습니다.

송신 드라이버와 수신 드라이버가 동시에 열릴수 없는 구조가 되는 것입니다.

이렇게 송신 드라이버와 수신 드라이버의 열고 닫음을 하드웨어적으로 구현할 때 RTS 신호를 이용하게 설계합니다.

그러므로 RS485 통신을 리눅스 프로그램상에서 하려면 이에 대한 제어를 해야하는데 의외로 이에 대한 자료가 부족한

형편입니다. 물론 시리얼 디바이스의 소스를 수정하여 이에 대한 제어를 할수도 있지만 그리 쉬운 작업이 아니지요.

이 강좌에서는 어플리케이션 단에서 이를 어떻게 처리하는지에 대한 간단한 샘플 소스를 정리한 것입니다.

3. 조건

이 소스는 이지보드의 시리얼 확장보드를 사용한 예입니다.

4. 소스

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

nt main( int argc, char **argv )

{

int fd,c, res;

struct termios oldtio,newtio;

char buf[255];

int modemctlline;

int txemptystate;

// 시리얼 장치를 연다.

fd = open( "/dev/ttySS0", O_RDWR | O_NOCTTY );

if (fd <0)

{

// 화일 열기 실패

printf( "Device OPEN FAIL\n");

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

tcflush(fd, TCIFLUSH);

tcsetattr(fd,TCSANOW,&newtio);

// 현재 설정된 모뎀 제어 레지스터를 읽는다.

ioctl( fd, TIOCMBIS, &modemctlline);

// RTS를 HIGH로 만든다.

modemctlline = TIOCM_RTS;

ioctl( fd, TIOCMBIS, &modemctlline );

// 데이타를 출력한다.

memset( buf, c, 32 ); buf[32]=0;

write( fd, buf, 32 );

printf( "DATA : [ %s ]\n", buf);

// 모든 데이타가 전송되어 완전하게 버퍼가

// 비워질때까지 대기한다.

while( 1 )

{

ioctl( fd, TIOCSERGETLSR, &txemptystate);

if( txemptystate ) break;

}

// RTS를 LOW로 만든다.

modemctlline = TIOCM_RTS;

ioctl( fd, TIOCMBIC, &modemctlline );

// 잠시 대기한다.

sleep(1);

// 데이타를 읽는다.

res = read(fd,buf,255);

buf[res]=0;

printf("%s:%d\n", buf, res);

// 통신상태를 원 위치한다.

tcsetattr(fd,TCSANOW,&oldtio);

close( fd );

return 0;

}

출처 : http://www.falinux.com/win/study/09/rs485.html

이 포스트를..

덧글 1개 엮인글 쓰기