도와주세요!!
글 수 15,339
2007.05.15 19:31:45 (*.241.183.9)
6684
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/poll.h>
#include <termios.h>
#include <fcntl.h> // O_RDWR , O_NOCTTY 등의 상수 정의
int main( void)
{
int fd;
int ndx;
int cnt;
char buf[1024];
struct termios newtio;
struct pollfd poll_events; // 체크할 event 정보를 갖는 struct
int poll_state;
// 시리얼 포트를 open
fd = open( "/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK ); // 디바이스를 open 한다.
if ( 0 > fd)
{
printf("open errorn");
return -1;
}
// 시리얼 포트 통신 환경 설정
memset( &newtio, 0, sizeof(newtio) );
newtio.c_cflag = B9600 | CS8 | CLOCAL | CREAD | IGNPAR;
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);
write( fd, buf, cnt);
printf( "data received - %d %sn", cnt, buf);
}
else if ( poll_events.revents & POLLERR) // event 가 에러?
{
printf( "통신 라인에 에러가 발생, 프로그램 종료");
break;
}
}
}
close( fd);
return 0;
}
위의 예제 소스를 약간 변형하여 리더기로 부터 테크값을 받아 오려고 하엿는데 ( RS-232 통신 맞습니다.)
(속도와 포트 이름정도 바꾸었습니다.)
소스 내부의
===========================================
printf( "data received - %d %sn", cnt, buf);
===========================================
for(i=0 ; i < 데이터의 길이 ; i ++)
{
printf ("%sn"buf[i]);
}
와 같은 형태로 출력 부분을 교체 해보아도 이상한 결과만 나옵니다.
위으 printf 문의 출력 형태가 잘못 되어 안나오는것인지요?
아니면 리더기로 부터 시리얼 통신으로 값을 받아오는 설정이 잘못된것 인 지요?
장길석님....조언 부탁드립니다.
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/poll.h>
#include <termios.h>
#include <fcntl.h> // O_RDWR , O_NOCTTY 등의 상수 정의
int main( void)
{
int fd;
int ndx;
int cnt;
char buf[1024];
struct termios newtio;
struct pollfd poll_events; // 체크할 event 정보를 갖는 struct
int poll_state;
// 시리얼 포트를 open
fd = open( "/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK ); // 디바이스를 open 한다.
if ( 0 > fd)
{
printf("open errorn");
return -1;
}
// 시리얼 포트 통신 환경 설정
memset( &newtio, 0, sizeof(newtio) );
newtio.c_cflag = B9600 | CS8 | CLOCAL | CREAD | IGNPAR;
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);
write( fd, buf, cnt);
printf( "data received - %d %sn", cnt, buf);
}
else if ( poll_events.revents & POLLERR) // event 가 에러?
{
printf( "통신 라인에 에러가 발생, 프로그램 종료");
break;
}
}
}
close( fd);
return 0;
}
위의 예제 소스를 약간 변형하여 리더기로 부터 테크값을 받아 오려고 하엿는데 ( RS-232 통신 맞습니다.)
(속도와 포트 이름정도 바꾸었습니다.)
소스 내부의
===========================================
printf( "data received - %d %sn", cnt, buf);
===========================================
for(i=0 ; i < 데이터의 길이 ; i ++)
{
printf ("%sn"buf[i]);
}
와 같은 형태로 출력 부분을 교체 해보아도 이상한 결과만 나옵니다.
위으 printf 문의 출력 형태가 잘못 되어 안나오는것인지요?
아니면 리더기로 부터 시리얼 통신으로 값을 받아오는 설정이 잘못된것 인 지요?
장길석님....조언 부탁드립니다.
그렇다면 입력받은 것이 buf 이라면 for 문을 아래와 같이 바꾸셔야 합니다.
printf( "%s\n", buf)
이렇게 했을 때, 문자열은 안 보이고 깨진다면 리더기의 통신 보오율을 데이터 비트의 크기를 확인해 보십시오.