시리얼 통신 관련 질문입니다.

cococo의 이미지

다른 소스를 보고 고치면서 프로그램을 실행시켜 보고 있는데요.
이상한 게 나와서 질문하려 합니다.

1. 프로그램을 실행시키면, 받는 쪽이 보내는 쪽 보다 한 템포 느립니다.
예를 들어, 프로그램을 실행시키고 보내는 쪽에서 (이 프로그램은 받는 쪽입니다) 1,2,3,.... 0 을 하나씩 타자로 쳐보면,
맨처음 1을 쳤을 때는 " res > 0" 이라는 메시지만 나오고, 2를 눌렀을 때부터 "1", 3을 누르면 그제서야 "2"... 이런식으로 한 템포씩 느립니다. 왜그럴까요?

2. 프로그램에서, z를 입력하면 끝나게 되어 있지 않습니까?
그런데, z를 입력한 다음, 소스에서는 " loop end" 라는걸 찍어 주고 종료하게 되어 있는데, 실제로는 "loop end"라고 찍히지도 않을 뿐더러, 프로그램이 종료되지도 않습니다.

왜이럴까요? 옵션도 바꾸어 보고, 원래 프로그램이랑 비교도 해 봤는데 차이점을 모르겠더라고요. 원래 프로그램은 제대로 잘 받는데... 이상하네요.
이게 제가 고친 소스입니다.
---------------------------------------
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>

#define BAUDRATE B38400

#define FALSE 0
#define TRUE 1

volatile int STOP = FALSE;

main( int argc, char *argv[] )
{
int fd, c, res;
struct termios oldtio, newtio;
char buf[256];

printf(" \tprogram started\n");

if (argc != 2)
{ printf("\n usage : %s serialPortName " , argv[0]);
exit(0);
}

fd = open(argv[1], O_RDWR | O_NOCTTY | O_NONBLOCK) ;
if (fd < 0) {
printf("\n Error On open serial");
perror( MODEMDEVICE ); exit(-1); }

tcgetattr( fd, &oldtio);
bzero(&newtio, sizeof(newtio));
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD ;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
newtio.c_lflag = 0;
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;

tcflush(fd, TCIFLUSH); tcsetattr(fd, TCSANOW, &newtio );

printf("\tEnd Setup\n");
strncpy(buf , "Start Program\n", 15);
write(fd, buf, 15);

while( STOP == FALSE )
{ res = read(fd, buf, 1);
if ( res > 0 )
{ printf("res > 0\n");
printf(" [%c],[%d]", *buf, res);
if (buf[0] == 'z')
{ printf(" z signal comes into.\n" );
STOP = TRUE; }
}
}

printf("\n roop ended");
tcsetattr(fd, TCSANOW, &oldtio);
close(fd);
printf("program ended.\n ");
}

----------------------------------------------

제 무지를 깨우쳐 주실 분. 기다립니다.

좋은 하루 되시기 바랍니다.

언제나 답변 주시는 것. 고맙습니다.

File attachments: 
첨부파일 크기
파일 test2.c1.24 KB
지리즈의 이미지

printf(" [%c],[%d]", *buf, res); printf(" [%c],[%d]", buf[0], res); 로 한번 해보세요...

제 생각에는 한바이트식읽어내는 것 보다는
예제처럼 충분한 크기씩 받아와
하나씩 찍어 내는 것이 낫을 듯하네요.

res = read(fd, buf, 255); 
for(c=0; c<res; c++){
  printf(" [%c],[%d]", buf[c], c);
  if (buf[c] == 'z')  { 
     printf(" z signal comes into.\n" ); 
     STOP = TRUE; 
  } 
} 

There is no spoon. Neo from the Matrix 1999.

ydongyol의 이미지

단순히 한박자가 느리다면

printf(" [%c],[%d]\n", *buf, res);

printf("\n roop ended \n");

--
Linux강국 KOREA
http://ydongyol.tistory.com/

mach의 이미지

ckbcorp wrote:

......
char buf[256];

printf(" \tprogram started\n");
.....


라이브러리의(*printf()시리즈 )버퍼링 문제라면 다음과 같은 해결도 있습니다.
#include <stdio.h>
......
......
   char buf[256];
                
   setbuf( stdout, 0); //한줄 추가, 버퍼를 0(NULL)으로;즉, 버퍼링 안함
   printf("  \tprogram started\n");
.....

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

댓글 달기

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