시리얼 통신에 관한 질문
안녕하세요.
시리얼통신중에 해결할 문제가 있어서 이렇게 질문드립니다.
데이타를 받는중에 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(...,
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 바이트값 밖에는 안 받아지는데
제가 원하는것을 얻으려면 어떻게 해야 하나요?
read n 하려면...
7f 이상 값 받는 부분은 잘 모르겠구요. (누구 아시는 분? )( --)(-- )( --)
갯수 이상 받는 건요.
위에서도 설명 있지만, 예를들어
int rv = 0, n = 999;
.
.
.
while(1)
{
rv += read( fd , buf, n);
if (rv >= n) break;
}
처럼 코드로 처리를 해 줘야 한다는 소리죠.
한번에 다 못 받으면 다 받을 때까지 read해 줘서요.
뭐. 다른 방법도 있을지 모르겠습니다만... ^^
답변 감사드립니다
답변 감사립니다. :D
댓글 달기