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에 있는 문서 보고 일반적으로 만들었습니다.


댓글 달기