[시리얼통신 질문]select()함수에서 struct timeval::tv_usec에
글쓴이: neverdie / 작성시간: 목, 2005/03/31 - 12:14오전
현재 시리얼통신을 하고 있습니다.
윈도우컴퓨터에 가상 시뮬레이터가 돌고 있고
리눅스컴퓨터에서 제가 만든 프로그램하고 시리얼통신을 합니다.
select()함수를 이용해서 비동기송신을 하고 있습니다.
그런데 시뮬레이터가 긴 데이타를 보내면 제 프로그램에서 제대로
수신을 못해서
struct timeval::tv_usec = 6100;
값을 넣어줬습니다.
저렇게 하면 프로그램이 블락되는거 맞나요?
타임아웃값을 안주면 제대로 수신안되고... ㅠ.ㅠ
Forums:
man page보시면 timeout 값을 0으로 주면 계속 블락되고t
man page보시면 timeout 값을 0으로 주면 계속 블락되고
timeout 값이 0이 아니면 그 시간 만큼만 블락되죠.
struct timeval::tv_usec = 6100;
이 값을 어디서 정의 하셨나요? 왜냐면 linux에서는 select함수가 실행될때마다 timeout값을 바꿉니다.select()함수 호출하기전에 값을 변경합니다.
select()함수가 호출되기전에 값을 셋팅해주고 있습니다.
현재 timeout값을 0으로 한후 한바이트 읽을때매다 값을 체킹해서 메시지 블락을 읽고 있습니다.
안녕하세요~ ^^
오해가 있을까봐 select()함수의 마지막 파라메터를 NULL로 주는
오해가 있을까봐 select()함수의 마지막 파라메터를 NULL로 주는 경우 block되고, struct timeval timeout;등을 선언해서 이 변수의 번지값(포인터)를 주면, 이 변수에 지정된 시간만큼 블록됩니다.
예를 들어,
1) 1.4초동안 블록시키려면
struct timeval timeout;
timeout.tv_sec = 1;
timeout.tv_usec= 400000; // 1,000,000으로 나누면 초로 환산됨
select(,,, &timeout); //앞부분 파라메터는 생략함
이 경우 1.4초동안 블록되었다가 타임아웃값에 도달하면 탈출하고,
READ, WRITE이벤트가 발생하면 1.4초 이내에도 탈출가능
즉, 0~1.4초까지 블록될 수 있음
2) 만일 다음과 같이 한다면
select(,,,, 0); // 블록됨 숫자 0이 아니라 번지 0 또는 NULL임
3) 만일 다음과 같이 한다면
timeout.tv_sec = 0;
timeout.tv_usec= 0; // 1,000,000으로 나누면 초로 환산됨
select(,,, &timeout); //앞부분 파라메터는 생략함
0초동안 블록됨
===========
* 윈도우 시뮬레이터 작성시(시리얼 프로그램) 버퍼 크기를 넉넉하게 주었는지 검사해보세요. 디폴트값은 128 이던가 (정확하지는 않음, 아주 오래되서 가물~)인데, 이 값을 수 KB로 늘리는것이 중요합니다. 어쩌면 이쪽 문제일수도 있을듯 하다는.....
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
Re: [시리얼통신 질문]select()함수에서 struct timeval::tv_use
만일 tv_sec에 값을 0으로 주었다면,
6100/1000000 = 0.0061초 이네요.
6ms 동안 block시키려고 한것이라면....
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
댓글 달기