시리얼 통신 관련 질문입니다.
다른 소스를 보고 고치면서 프로그램을 실행시켜 보고 있는데요.
이상한 게 나와서 질문하려 합니다.
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 ");
}
----------------------------------------------
제 무지를 깨우쳐 주실 분. 기다립니다.
좋은 하루 되시기 바랍니다.
언제나 답변 주시는 것. 고맙습니다.
첨부 | 파일 크기 |
---|---|
test2.c | 1.24 KB |
[code:1]printf(" [%c],&
printf(" [%c],[%d]", *buf, res);
를printf(" [%c],[%d]", buf[0], res);
로 한번 해보세요...제 생각에는 한바이트식읽어내는 것 보다는
예제처럼 충분한 크기씩 받아와
하나씩 찍어 내는 것이 낫을 듯하네요.
There is no spoon. Neo from the Matrix 1999.
단순히 한박자가 느리다면[code:1]printf(&quo
단순히 한박자가 느리다면
printf(" [%c],[%d]\n", *buf, res);
printf("\n roop ended \n");
--
Linux강국 KOREA
http://ydongyol.tistory.com/
Re: 시리얼 통신 관련 질문입니다.
라이브러리의(*printf()시리즈 )버퍼링 문제라면 다음과 같은 해결도 있습니다.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
댓글 달기