read 함수의 사용에서 no-delay문제
fd = open()함수로 파일 또는 시리얼 포트 등을 열고
read 함수로 읽어올때 일반적으로 no-delay optian은 밑과 같은걸로 알고있습니다.
fcntl(fd, F_SETFL,O_NDELAY);
제가 사용하는 코드
while(1)
{
state = read(fd, buf, 255);
if(state > 0)
{
:
printf("\n");
}
}
서도 작 작동됨니다.
하지만 제가 시리얼 포트를
non-canonical
newtio.c_cc[VTIME] = 1;
newtio.c_cc[VMIN] = 0;
로 설정해서 보통 매 read함수로 읽을때 만다 거의 한byte를 읽어오는데
여러번 read함수를 반복해서 4byte를 읽으면 화면에 값을 축력 하게 프로그램 했습니다.
이때 는 코드 중간의 printf("\n"); 문이 선택적으로 동작을 하게 되겠죠.
이러면 문제 가 생기더군요.
그래서 임시적으로
while(1)
{
state = read(fd, buf, 255);
printf("\n");
sleep(1); /*1초 delay 너무 빨리 회면에 출력되서*/
if(state > 0)
{
:
}
}
이렀게 해서 사용하는데
왜 read함수를 사용하고 printf("\n"); 출력되야 다시 read함수를 사용하 수 있지 printf("\n"); 를 출력하지 않으면 시리얼로 data가 들어와 buffer에 쌓이더라도 read함수로 읽어올수가 없는것 같은데 왜그런가요?
시리얼 option에서 \n를 사용하게 설정이 되있는건지 왠지 궁금하군요
(
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NDELAY);
printf("seral port open :%d \n\r",fd);
if (fd <0) {perror(MODEMDEVICE); exit(-1); }
tcgetattr(fd,&oldtio); /* 현재 설정을 oldtio에 저장 */
bzero(&newtio, sizeof(newtio));
newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR;
// newtio.c_lflag = 0;
// newtio.c_oflag = 0;
newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
newtio.c_oflag &= ~OPOST;
newtio.c_cc[VTIME] = 1;
newtio.c_cc[VMIN] = 0;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
fcntl(fd, F_SETFL,O_NDELAY);
)
시리얼 포트는 외와 같이 KLDP에 있는 문서 보고 일반적으로 만들었습니다.
댓글 달기