Uart 통신간 read, write 문제
글쓴이: hyun119 / 작성시간: 금, 2007/09/21 - 10:34오전
지금 Uart 통신을 하고 있는데 데이타를 주고 받는 중에 실시간으로 받고 실시간으로 보내야하는데 어떻게 짜야 할지 모르겠습니다.
현재 Uart를 Open으로 열어서 Tx는 write로 Rx는 read로 하고 있습니다.
문제는 Tx는 무한 루프를 돌려고 데이타가 있을 때만 보낼 수 있겠는데
Rx는 무한 루프를 돌리면 데이타가 없을 때는 계속해서 그쪽에 멈춰 있는 겁니다.
그래서 다시 Tx로 돌아가지 못하고 데이타가 있을 때까지 기다리다가 받고 무한 루프니깐
다시 또 데이타를 기다리는 형식으로 밖에 안됩니다.
혹시 Rx를 할 때 데이타가 없으면 다시 Tx로 가고 Tx 데이타가 없으면 Rx로 가는 이런 무한 루프를
돌릴 방법이 없는 것입니까?
read에서 데이타가 없는 것을 검출 할 수 있는 방법이 있습니까?
도와주십시오.
Forums:
1) nonblocking mode라는
1) nonblocking mode라는 것이 있습니다.
특성은, read기준으로 설명하면,
- 데이터가 있거나, 없거나 즉시 리턴한다.
- 당연히 데이터가 있을 경우 읽고서 그 길이를 (바이트 수) 리턴한다.(실데이터야 버퍼에 넣어서 주고....)
- 데이터가 없다면, -1을 리턴한다. (**** 중요, 리턴값에 아주 유의해야 한다.)
non-blocking모드로 세팅해서 read하면 되겠습니다.
방법은 fcntl(), non blocking 으로 검색하면 많은 예제가 나오리라고 봅니다.
** 주의: blocking모드와 non-blocking모드는 리턴값의 의미가 다소 상이하므로 모드에 따른 리턴값 체크를 잘~ 해야할것이다.
2) 방법 2
읽을 데이터가 있는지 검사하고 있다면, read()를 호출
쓸수 있는 상태(운영체제 디바이스 드라이버의 출력버퍼가 비어졌다면...)를 검사하고, 쓸 수 있다면, write()를 호출
이렇게 할 수 있는데, 이러한 읽기, 쓰기등의 상태를 검사해 보고 실제 IO를 행할 수 있겠지요.
검사하는 시스템호출로 select()를 사용할 수 있습니다. (참고로, select말고도, poll, epoll등이 리눅스에서는 가능합니다, 운영체제별로 다소 차이가 있을 수 있으나, select와 poll은 모든 *nix 운영체제에서 지원됩니다.)
3) 방법 3
멀티쓰레드 또는 멀티 프로세스로 프로그래밍한다.
당연히 읽기만 열심히, 쓰기만 열심히 하면 됩니다.
어려운 점은 두 프로세스/쓰레드간에 자료의 교환 및 동기화 메카니즘이 좀 걸리지요.
---- 즐~
답변 감사합니다
3가지의 방법이나 적어주셔서 정말로 감사합니다
방법 3은 생각 안해 본건 아니지만 쓰레드를 써본적이 1~2번이라서 왠만해서는 피할라고 했거든요
그래도 2가지 방법이 더 있으니 열심히 해보겠습니다.
답변 진심으로 감사드립니다. 즐거운 추석 보내십시오.
답변 감사합니다
3가지의 방법이나 적어주셔서 정말로 감사합니다
방법 3은 생각 안해 본건 아니지만 쓰레드를 써본적이 1~2번이라서 왠만해서는 피할라고 했거든요
그래도 2가지 방법이 더 있으니 열심히 해보겠습니다.
답변 진심으로 감사드립니다. 즐거운 추석 보내십시오.
댓글 달기