시리얼 포트 감시에 대해서..
글쓴이: cdcmp / 작성시간: 월, 2004/09/13 - 1:14오전
안녕하세요...
시리얼 포트 감시에 대해서 질문이 있습니다...
현재 저의 프로그램에서는 while문에 의해서 계속 시리얼 포트를 감시하고
있거든요...
코드는 다음과 같습니다...
void laser::serial() { int nread,result; struct termios oldtio, newtio; struct timeval timeout; int max_fd; fd_set readfs; fd0 = open(SERIALDEVICE,O_RDWR|O_NOCTTY); if(fd0<0) { QMessageBox::information(this,"port", "file open error"); perror(SERIALDEVICE); exit(-1); } tcgetattr(fd0,&oldtio); bzero(&newtio, sizeof(newtio)); newtio.c_cflag= (CS8+BAUDRATE+CREAD+CLOCAL+HUPCL); newtio.c_lflag &= ~ICANON; newtio.c_iflag = IGNPAR | ICRNL; newtio.c_oflag = 0; tcflush(fd0, TCIFLUSH); tcsetattr(fd0,TCSANOW,&newtio); while(1) { fp = fopen("/home/eunsu/serial/select/laser1/data.txt","a+"); timeout.tv_usec = 100; /* 0.1milliseconds */ timeout.tv_sec = 0; /* seconds */ FD_ZERO(&readfs); FD_SET(fd0,&readfs); max_fd = fd0 + 1; result = select(max_fd, &readfs, NULL, NULL, &timeout); switch(result) { case 0: printf("timeout\n"); break; case -1: perror("select"); exit(1); default: if(FD_ISSET(fd0, &readfs)) { ioctl(fd0,FIONREAD,&nread); nread = read(fd0,&rx_buf[i],1); fprintf(fp,"%x \n",rx_buf[i]); printf("%x \n",rx_buf[i]); i++ ; } break; } fclose(fp); } tcsetattr(fd0,TCSANOW,&oldtio); }
위의 코드에서 보듯이 시리얼 포트를 감시해서 버퍼에서 데이터를 읽어 오는
것이 모두 while문 내에서 실행이 됩니다...
그런데 시리얼 포트만 계속 감시해서 데이터를 읽어 오는게 아니고 다른
작업도 해야 하는데....
예를 들면 시리얼로 읽어온 데이터값으로 다른 하드웨어적인 처리를 하는것..
등등...
그러기 위해서는 while문을 빠져 나가야 됩니다..
그렇다고 시리얼 포트에서 읽어오는 데이터를 그만 읽고 다른 작업을 할수가
없어서...
다른 작업을 하면서 시리얼 포트의 데이터를 읽을수 있는 방법이 없을까요?
윈도우 에서는 시리얼 통신시 쓰레드라는 함수를 사용하는데...
리눅스에서도 쓰레드라는것이 있더라고요...
그런데 리눅스에서의 쓰레드도 윈도우에 사용되는 쓰레드와 같은 개념인지..
아직 쓰레드라는게 어떻게 적용되는지 이해가 가지를 않네요...
한개 해결 되면 또다른 곳에서 문제가 생겨버리고....ㅡㅡ
그럼 수고하세요...
Forums:
1. 쓰레드로 처리한다.2. fork 로 하나 더 뛰우고 pipe 연
1. 쓰레드로 처리한다.
2. fork 로 하나 더 뛰우고 pipe 연결해서 이벤트를 받는다..
3. serial 설정을 약간 변경하여 nonblock 으로 처리 한다.
이중 1, 2 번은 많이 나오는 문제니 빼고,
3번항의 경우
newtio.c_cc[VTIME] = 0; // 문자 사이의 timer를 disable
newtio.c_cc[VMIN] = 0; // 이값이 0이면 값을 받든안받든 턴
으로 처리 하면 됩니다.
이래나 저래나 루프는 돌아야 겠지만 저렇게 쓰고 select 쓰지 말고 그냥 read 로 읽는 부분을 만들고 필요시마다 호출하다록 해서 사용해 보세요.
=================================
:: how about a cup of tea ? ::
=================================
위의 1,2,3 번의 절차를 거쳐야 하는군요..아직 시작을 안해봐
위의 1,2,3 번의 절차를 거쳐야 하는군요..
아직 시작을 안해봐서 그런지....좀 복잡아 보이네요...
쓰레드...fork....pipe......개념을 잡기가 힘드네요...ㅡㅡ
혹시 시리얼 통신 등으로 쓰레드를 이용해서 하드웨어 제어 해보신 분들 계신지
요..??
책을 좀 많이 찾아봐야 겠네요...
답변 감사합니다..^^
댓글 달기