시리얼통신에 대해서 다시한번 문의 드립니다..

cdcmp의 이미지

안녕하세요...

얼마전에 시리얼 통신 때문에 문의를 드렸었는데 다시한번 문의를 드립니다...

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]); 
    }
    }
} 
송지석의 이미지

read의 리턴값은 어떻게 되는지요?
write와 read의 리턴값을 확인하시는 게 어떨까합니다.

쎄피로의 이미지

잘은 모르겠으나 non-blocking이면 기다리지 않고 진행한다는

의미인데, 루프에서 read를 순식간에 돌아버리고 끝나는 것이 아닐지요?

select를 사용해서 read해 보심은 어떠신지요..

세상은 넓고, 할 일은 많은데, 난 숨만 쉬고 있니?

yeppiguy의 이미지

term.c_lfag &= ~ICANON;

를 추가하세요.

cdcmp의 이미지

답변 감사합니다..^^

문자열은 출력이 되는데...하나하나의 문자는 출력이 안되네요...

read로 읽어들인 문자 갯수는 맞게 나오는데....

정작 buf에 저장된 문자는 출력이 안되네요...

printf를 잘못썼는지....ㅡㅡ

코드는 다음과 같습니다...

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>

#define  SERIALDEVICE "/dev/ttyMP0"
#define  BAUDRATE

#define FALSE 0
#define TRUE 1

volatile int STOP=FALSE;

char *BUFF[12] = {"a","b","c","d","e","f","g","h","i","j","k","l",};

main()
{
	int fd;
	int i,res;
	struct termios term;
	char *buf[4096];
	
	fd = open(SERIALDEVICE,O_RDWR|O_NOCTTY);
	if(fd<0)
	{
		printf("file open error\n");
		perror(SERIALDEVICE);
		exit(-1); 
	}
			
	tcgetattr(fd,&term);
	bzero(&term, sizeof(term));
	term.c_cflag= (CS8+BAUDRATE+CREAD+CLOCAL+HUPCL);
	term.c_lflag = 0;
	term.c_iflag = IGNPAR;
	term.c_oflag = 0;
		
	term.c_cc[VTIME] = 0;   /* 문자 사이의 timer를 disable */
     	term.c_cc[VMIN] = 10;   /* 최소 10 문자 받을 때까진 blocking */
	tcflush(fd, TCIFLUSH);
	tcsetattr(fd,TCSANOW,&term);
		
	while(STOP == FALSE)
	{
		for(i=0;i<13;i++)
		{		
			write(fd,&BUFF[i],12);
			res = read(fd,&buf[i],sizeof(buf));						
	 	       	printf("%c :%i\n",&buf[i],res);
		}
	 }
}

에구....아주 사소한곳에 문제가 있을거 같은데요....

그 사소한곳이 눈에 안보이니 원....

감사합니다...^^

송지석의 이미지

write 후에 fflush
해보시면 어떨까요

bugiii의 이미지

char* BUFF[12] 가 아니라 char BUFF[12] 를 원하시는 것 아닌가합니다. 또 char* buff[4096] 도 포인터의 배열을 원하신게 아닌 것 같습니다.

또 for 루프 안의 보내기 받기때 주는 버퍼 크기가 1이 아닌 것도 이상합니다. 의도는 하나씩 보내고 받기 아니었나요? 지금같은 루프는 쓰레기값이 붙을 확률이 아주 높을 것 같습니다.

댓글 달기

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