read 관련 간단한 질문드립니다.
글쓴이: twinwings / 작성시간: 월, 2014/11/10 - 8:10오후
Serial(UART) 통신 중에 살짝 문제가 있습니다.
패킷의 기본 구조는
|1 Octet, 패킷길이 | 가변길이 데이터....|
이런 구조가 되겠고,
// 처음 1바이트는 패킷의 길이를 의미한다. read(fd, &len, 1); // 패킷의 나머지를 읽는다. read(fd, &buffer, len);
이런 간단한 코드가 되겠는데요.
전송속도가 충분하지 않아서 그런지 한번의 read로 못읽는 경우가 종종 있습니다.
for(i=0; i<len; i++) read(fd, &bufer, 1);
이런식의 코드로 해결이 가능하기는 한데, 효율성에 의심이 가더군요.
그런데 제가 찾아본 답변들은 상당수 저런 해결책을 내놓았습니다. 운영체제 수준에서
지정한길이까지 모두 읽지 않으면(데이터가 수신되지 않으면) block이 되도록하는 옵션이 어디 없을까요??
Forums:
저는 delay를 주었습니다.
제가 최근에 MFC로 작업하다가, 비슷한 문제가 있었습니다.
제가 사용한 것은 MFC에서 Serial로 데이터가 들어올 경우, Event handler가 동작하는 방식으로 구성하였는데요.
20 byte의 짧은 데이터가 완전히 들어올때가 있고, 짤려서 들어올때가 있더라고요..
과감하게, 10 ms 쉬고, buffer에서 데이터 읽어오도록 하였습니다.
이 방식이 정답은 아닐 것 같은데.. 급하시다면 이 방식을 사용해보세요.
...
운영체제에서 block이 되면서 끝까지 읽는 걸 보장하는 함수는 없는 걸로 알고 있습니다.
http://www.informit.com/articles/article.aspx?p=169505&seqNum=9
여기 나온 readn 함수를 보고 그대로 따라 하시면 될 것 같습니다만...
댓글 달기