시리얼 통신에 관한 질문

sinxine111의 이미지

안녕하세요.
시리얼통신중에 해결할 문제가 있어서 이렇게 질문드립니다.

데이타를 받는중에 0x7f 이상의 값이 들어오면 그냥 리턴을 해버립니다.

셋팅값이 문제가 있는것 같은데요. 리눅스 책을 보고 이리저리 셋팅값을 바꿔봐도 결과는 마찬가지입니다.

아래 소스를 보시면 셋팅은 non-canonical 모드로 설정하였습니다.


int RxCount=0;
char Buff[500];

handle = open( "/dev/ttyS00", O_RDWR | O_NOCTTY );
if( handle < 0 ) { printf( "Serial Open Fail [/dev/ttyS00]\r\n " );exit(0);}

newtio.c_cflag = B9600 | CS8 | CLOCAL | CREAD ;
newtio.c_iflag = IGNPAR ;
newtio.c_oflag = 0;

//set input mode (non-canonical, no echo,.....)
newtio.c_lflag = 0;

newtio.c_cc[VTIME] = 50;
newtio.c_cc[VMIN] =0;

tcsetattr( handle, TCSANOW, &newtio );



RxCount = read( handle, Buff, 429); // 429byte 값을 받는다.
if( RxCount == 0 ){ printf( "Receive Time Over\n" ); }
if( RxCount < 0 ) { printf( "Read Error\n" );}
printf("rxcount :%d\n",RxCount);
for(i=0;i<429;i++)printf("%02x",Buff[i]);
printf("\n:");


대충 이렇게 작성했다면 들어오는 데이타 중에 0x7f 이상의 값(0x94)가 들어오면 429 값을 다 받기 전에 빠져나옵니다.(Rxconut 값으로 확인)
그래서 newtio 에 있는 c_cflag,c_iflag,c_oflag 등등의 세팅값에 문제가 있는건지 아니면
아예 0x7f 이상의 값 다시말해 아스키값이 아닌것은 그냥 리턴되는지 알고 싶습니다.
저 뿐만 아니라 시리얼로 데이타 통신을 하는 어플리케이션에서 아스키값만 받는건 아닐진데 아마도 모르는 부분이 있는것 같습니다.

2. 그리고 256 바이트 넘는 값을 한꺼번에 받을수는 없는건가요?

익명 사용자의 이미지

read()에 대해서 잘~ 아셔야 할 듯 합니다.

read(...,429);하면

read가 마치 429바이트를 읽어줄것 같지만, 절대로 아닙니다.
read는 위의 경우 <= 429 를 보장할 뿐입니다.

따라서, 특정 사이즈 이상 읽기를 보장하는 read를 구현하는것이 때에 따라 필요하기도 합니다.

readn 뭐 이런식으로 구현되어 있는 라이브러리가 널렸지요.
요지는, read()의 속성을 잘~ 알고 구현하는 것이지요.

* 참고로, write도 대동소이합니다.

익명 사용자의 이미지

네 답장감사드리고요.
그러면 0x7f 이상의 값이 들어오면 리턴하는 셋팅은 non-canonical
모드에서는 없는건가요?

둘째로 429바이트 이상의 값을 받기위해

newtio.c_cc[VTIME] = 50;
newtio.c_cc[VMIN] =429;

이렇게 셋팅하더라도 127 바이트값 밖에는 안 받아지는데

제가 원하는것을 얻으려면 어떻게 해야 하나요?

cococo의 이미지

7f 이상 값 받는 부분은 잘 모르겠구요. (누구 아시는 분? )( --)(-- )( --)
갯수 이상 받는 건요.
위에서도 설명 있지만, 예를들어

int rv = 0, n = 999;
.
.
.
while(1)
{
rv += read( fd , buf, n);
if (rv >= n) break;
}

처럼 코드로 처리를 해 줘야 한다는 소리죠.
한번에 다 못 받으면 다 받을 때까지 read해 줘서요.
뭐. 다른 방법도 있을지 모르겠습니다만... ^^

익명 사용자의 이미지

답변 감사립니다. :D

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.