도와주세요!!
글 수 15,339
2004.06.17 08:52:33 (*.244.218.12)
6706
개구리님 안녕하세요.
답변해주신대로 인터넷에서 rs232<--> rs485로 변환하는 변환장치를
하나 구입했답니다.
제가 하려는 목적은 EZ-X5에서 제어를 하기 위한것이구요..
개구리님의 강좌중에서 rs485 rts 제어하기 라는 프로그램을 찾았습니다.
이 프로그램을 구동하면 디바이스 드라이버단에서의
수정은 필요가 없는것인지요...
단순히 아래 프로그램을 돌리면 기본적인 통신은 되는것인지 알고 싶습니다.
#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
");
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 ]
",
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
", buf, res);
// 통신상태를 원 위치한다.
tcsetattr(fd,TCSANOW,&oldtio);
close( fd );
return 0;
}
답변해주신대로 인터넷에서 rs232<--> rs485로 변환하는 변환장치를
하나 구입했답니다.
제가 하려는 목적은 EZ-X5에서 제어를 하기 위한것이구요..
개구리님의 강좌중에서 rs485 rts 제어하기 라는 프로그램을 찾았습니다.
이 프로그램을 구동하면 디바이스 드라이버단에서의
수정은 필요가 없는것인지요...
단순히 아래 프로그램을 돌리면 기본적인 통신은 되는것인지 알고 싶습니다.
#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
");
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 ]
",
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
", buf, res);
// 통신상태를 원 위치한다.
tcsetattr(fd,TCSANOW,&oldtio);
close( fd );
return 0;
}