시리얼통신 질문입니다.

harisoo의 이미지

시리얼 프로그래밍중 이상한 부분이 있어서 글을 올려요.

지금 제가 KLDP의 시리얼하우투문서를 보면서 따라하고 있습니다. 그 중 select함수를 통한 멀티플레싱부분을 보고

따라하고 있는데 이상한 문제가 발생합니다. 자꾸 select함수가 리턴이 되는됩니다. 아래에 제 소스코드를 올립니다.

int main(void)
{
        fd_set readfds;
        int fd;
        struct termios options;
 
        if ( ( fd = open("/dev/ttyS1",O_RDWR | O_NOCTTY | O_NDELAY) ) < 0 ){
                printf("device file open error\n");
                return 1;
        }
 
        bzero(&options,sizeof(options));
        options.c_cflag = B19200 | CLOCAL | CREAD | CS8;
        options.c_iflag |= IGNPAR;
        options.c_oflag |= OPOST;
        options.c_oflag |= ONLCR;
        options.c_lflag = 0;
        options.c_cc[VTIME] = 0;
        options.c_cc[VMIN] = 0;
 
        tcflush(fd,TCIOFLUSH);
 
        if ( tcsetattr(fd, TCSANOW, &options) < 0 ){
                printf("tcsetattr  error\n");
                close(fd);
                return 1;
        }
 
        while(1){
                FD_ZERO(&readfds);
                FD_SET(fd,&readfds);
 
                if ( select(fd+1,&readfds,NULL,NULL,0) > 0 ){
                        printf("select() return\n");
                        if ( FD_ISSET(fd,&readfds) ){
                                fprintf(stdout,"port1 \n");
                                show_data(fd);
                        }
                 }
        }
        return 0;
}

여기가 수신부분이고 송신부분은 다 똑같고 루프문안에 5초마다 데이터를 보내도록 했습니다. 그런데 이상하게도

한번 데이터를 읽고나면 더이상 데이터가 남은부분이 없는데도 select()함수가 리턴됩니다. 실제 show_data함수에서는

아무것도 안나오거든요. 문제가 무엇인지 감을 못잡겠습니다. 송신데이터의 크기가 제각각이라면 문제가 되는걸까요?

지금 루트디렉토리의 각 파일을 열어서 그내용을 보내도록 했거든요. 물론 보낼때는 태그를 붙여서(제맘대로 정의한) 송신

데이터의 길이를 알 수 있습니다.

kewlbear의 이미지

select가 안보입니다. 코드를 다시 올려보세요.

harisoo의 이미지

죄송합니다 태그를 안붙엿네요 ...T^T

코퍼스의 이미지

흠.. 잘 안보이네요..^^
혹시, 송신측에서 EOF를 보낸건 아닐까요?

ls -al 'happy' | grep 'possible'

A few Good Man