이런거 경험해보신적 있나요? /dev/ttyS0관련

은영신랑의 이미지

5바이트 정보의 값을 계속해서 보내는 컴퓨터가 있고,
한대는 계속 받아서 프린트하게 해놓았는데요,

처음 몇 바이트를 보내면 read하는 컴퓨터는 가만히 있다가
#echo 1 > /dev/ttyS0 or
#ls > /dev/ttyS0

이런 식으로 한 바이트이상만 셀에서 쓰면 위의 프로그램에서
write해놓은 값까지 모두 읽어버리더라구요.
그리니깐 Read 하는 컴퓨터는 프로그램상에서 보낸값은 모두 버퍼에만 가지고
있고 실제로 셀상에서 보내주는 값에 의해 인터럽트가 걸려서 버퍼의 내용을
모두 읽게 되는것 같습니다.

셀상에서 cat , echo 명령등을 이용하면 서로 잘 통신 하거든요.
그런데 프로그램을 하면 좀 이상해지네요.
프로그램도 상당히 간단하게 만들었거든요.
단지 open, read, write 정도입니다.

감이 잘 안잡힙니다.

송지석의 이미지

혹시 fflush사용하시나요?

NAME
       `fflush'--flush buffered file output

SYNOPSIS
            #include <stdio.h>
            int fflush(FILE *FP);

DESCRIPTION
       The  `stdio' output functions can buffer output before delivering it to
       the host system, in order to minimize the overhead of system calls.

          Use `fflush' to deliver any such pending output  (for  the  file  or
       stream identified by FP) to the host system.

          If  FP  is  `NULL',  `fflush'  delivers pending output from all open
       files.
은영신랑의 이미지

제 소스는 아래와 같습니다.
pc1) #./getserial pc2)#./send
생각같아서는 pc2번에서 값을 보내자 마자 pc1에서는 받은 값을 출력해야 합니다.
그런데 그렇지를 않고, 다만
pc2) #echo 1 >/dev/ttyS0 or ls > /dev/ttyS0
등을 이용하면 위에서 보낸값 이외에 send에서 보낸 값까지 모두 출력이 됩니다.
제가 무언가를 잘못해준것 같기는 한데 잘 모르겠습니다.
Raw input mode로 모두 동일하게 설정해 주었고, O_NOCTTY 모드로도 시도는 해보았습니다.

getserial.c

        fd=open("/dev/ttyS1", O_RDWR);
        if(fd<0){
                printf("serial 1 open error.\n");
                return -1;
        }

        tcgetattr(fd, &newtio);
        cfsetispeed(&newtio, B9600);
        cfsetospeed(&newtio, B9600);
        newtio.c_cflag |= (CLOCAL | CREAD | CS8);
        newtio.c_iflag &= ~(ICANON | ECHO | ECHOE | ISIG);
        //newtio.c_oflag &= ~(OPOST);
        //newtio.c_oflag = 0;

        tcflush(fd, TCIFLUSH);
        if(tcsetattr(fd, TCSANOW, &newtio))
                printf("serial setting error.\n");
        else
                printf("serial setting ok.\n");

        while(1){

                read(fd, &buffer, 1);
                printf("buffer,, %d \n", buffer);
        }

send.c

         fd=open("/dev/ttyS0", O_RDWR);
        if(fd<0){
                printf("serial 1 open error.\n");
                return -1;
        }

        tcgetattr(fd, &newtio);
        cfsetispeed(&newtio, B9600);
        cfsetospeed(&newtio, B9600);
        newtio.c_cflag |= (CLOCAL | CREAD | CS8);
        newtio.c_iflag &= ~(ICANON | ECHO | ECHOE | ISIG);
        //newtio.c_oflag &= ~(OPOST);
        //newtio.c_oflag = 0;

        tcflush(fd, TCIFLUSH);
        if(tcsetattr(fd, TCSANOW, &newtio))
                printf("serial setting error.\n");
        else
                printf("serial setting ok.\n");

        while(1){
                buffer=i++;
                if(write(fd, &buffer, 1)!=1)
                      break;
                printf("buffer,, %d \n", buffer);
        }
은영신랑의 이미지

serial how-to-programming 의 Non-Canonical 입력모드 방식으로 바꾸어
사용해보니 해결이 되었습니다.
제가 많이 부족하다는 생각이 드네요......
읽어주셔서 감사합니다.

댓글 달기

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