시리얼통신에 대해서 다시한번 문의 드립니다..
글쓴이: cdcmp / 작성시간: 수, 2004/09/01 - 11:31오후
안녕하세요...
얼마전에 시리얼 통신 때문에 문의를 드렸었는데 다시한번 문의를 드립니다...
write는 되는거 같은데...read가 안되네요...
제가 사용하는 것은 시리얼 확장기를 사용하고 있습니다...
터미널에서 cat /dev/ttyMP0를 하고,
또다른 터미널에서 echo a>/dev/ttyMP0 를 하면 a라는 데이터가 나옵니다.
이걸로 봐서는 하드웨어적으로는 아무 문제가 없는거 같은데요...
코딩에서 read하는데 잘못됐는지....
포트의 rx핀과 tx핀을 같이 연결을 하여 rx에서 보낸 데이터가 tx로 바로
전송 되도록 하였습니다...
rx에서 "a","b","c".......와 같은 문자를 날리면 tx쪽에서는 버퍼에 한문자씩
저장되도록 하는건데요...
그런데 출력해본 결과 (null) 이라는 문자만 계속 찍혀 나오네요...
read와 write의 순서를 바꿔서도 해보고, O_NONBLOCK 모드를
O_NOCTTY로 바꿔서도 해봤는데 결과가 같은지라...
그리고 read해서 읽은 문자갯수를 확인해보면 -1이 나오던데...
이거 뭐가틀려도 한참 틀린거 같네요....
소스는 다음과 같습니다...
이걸로 일주일째 해메고 있네요.....
#include <stdio.h> #include <fcntl.h> #include <termios.h> char *BUFF[8] = {"a","b","c","d","e","f","g","h",}; /*sen data*/ void main(void) { int fd; int i, j, no; struct termios term; char *buf[4096]; /* receive data를 위한 buffer */ if ((fd=open("/dev/ttyMP0", O_RDWR | O_NONBLOCK ) ) < 0 ) { printf("file open error\n"); } tcgetattr(fd,&term); term.c_cflag = (CS8+B57600+CREAD+CLOCAL+HUPCL); term.c_lflag &= ~ECHO; tcsetattr(fd,TCSANOW,&term); while(1) { /* test data를 sending 한다. */ for ( i = 0; i < 8; i++) { write( fd, BUFF[i], 10); /* 버퍼 내용을 포트로 write 한다. */ read( fd, buf[i], sizeof(buf)); /* 입력 data가 있으면 buf에 저장한다. */ printf("%s\n", buf[i]); } } }
Forums:
read의 리턴값은 어떻게 되는지요?write와 read의 리턴값을
read의 리턴값은 어떻게 되는지요?
write와 read의 리턴값을 확인하시는 게 어떨까합니다.
rommance.net
잘은 모르겠으나 non-blocking이면 기다리지 않고 진행한다는
잘은 모르겠으나 non-blocking이면 기다리지 않고 진행한다는
의미인데, 루프에서 read를 순식간에 돌아버리고 끝나는 것이 아닐지요?
select를 사용해서 read해 보심은 어떠신지요..
세상은 넓고, 할 일은 많은데, 난 숨만 쉬고 있니?
[code:1]term.c_lfag &= ~ICANON;[/cod
term.c_lfag &= ~ICANON;
를 추가하세요.
답변 감사합니다..^^문자열은 출력이 되는데...하나하나의 문자는
답변 감사합니다..^^
문자열은 출력이 되는데...하나하나의 문자는 출력이 안되네요...
read로 읽어들인 문자 갯수는 맞게 나오는데....
정작 buf에 저장된 문자는 출력이 안되네요...
printf를 잘못썼는지....ㅡㅡ
코드는 다음과 같습니다...
에구....아주 사소한곳에 문제가 있을거 같은데요....
그 사소한곳이 눈에 안보이니 원....
감사합니다...^^
write 후에 fflush해보시면 어떨까요
write 후에 fflush
해보시면 어떨까요
rommance.net
char* BUFF[12] 가 아니라 char BUFF[12] 를 원하시
char* BUFF[12] 가 아니라 char BUFF[12] 를 원하시는 것 아닌가합니다. 또 char* buff[4096] 도 포인터의 배열을 원하신게 아닌 것 같습니다.
또 for 루프 안의 보내기 받기때 주는 버퍼 크기가 1이 아닌 것도 이상합니다. 의도는 하나씩 보내고 받기 아니었나요? 지금같은 루프는 쓰레기값이 붙을 확률이 아주 높을 것 같습니다.
댓글 달기