[시리얼통신 질문]select()함수에서 struct timeval::tv_usec에

neverdie의 이미지

현재 시리얼통신을 하고 있습니다.
윈도우컴퓨터에 가상 시뮬레이터가 돌고 있고
리눅스컴퓨터에서 제가 만든 프로그램하고 시리얼통신을 합니다.

select()함수를 이용해서 비동기송신을 하고 있습니다.
그런데 시뮬레이터가 긴 데이타를 보내면 제 프로그램에서 제대로
수신을 못해서
struct timeval::tv_usec = 6100;
값을 넣어줬습니다.

저렇게 하면 프로그램이 블락되는거 맞나요?
타임아웃값을 안주면 제대로 수신안되고... ㅠ.ㅠ

oasis의 이미지

man page보시면 timeout 값을 0으로 주면 계속 블락되고
timeout 값이 0이 아니면 그 시간 만큼만 블락되죠.

struct timeval::tv_usec = 6100; 이 값을 어디서 정의 하셨나요? 왜냐면 linux에서는 select함수가 실행될때마다 timeout값을 바꿉니다.

neverdie의 이미지

select()함수가 호출되기전에 값을 셋팅해주고 있습니다.

현재 timeout값을 0으로 한후 한바이트 읽을때매다 값을 체킹해서 메시지 블락을 읽고 있습니다.

안녕하세요~ ^^

mach의 이미지

오해가 있을까봐 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. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

mach의 이미지

neverdie wrote:

...
struct timeval::tv_usec = 6100;
...

만일 tv_sec에 값을 0으로 주었다면,

6100/1000000 = 0.0061초 이네요.
6ms 동안 block시키려고 한것이라면....

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.