RS232 통신에서 Canonical 전송시~~

phoino20의 이미지

Canonical 전송시 Write부분이 이상한것 같아서 이렇게 문의 드립니다.

일단 소스는 아래와 같구요~~

전송시 값이 안넘어 가거나 이상한 값으로 인식 그리고 한꺼번에 나오는등

이상해서요~~

코드는 아래와 같습니다...

#define BAUDRATE B38400
#define MODEMDEVICE "/dev/ttyS0"
#define _POSIX_SOURCE 1

#define FALSE 0
#define TRUE 1

volatile int STOP=FALSE;

main()
{
	int fd, c, res, i;
	struct termios oldtio,newtio;
	char buf[255];

	fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NDELAY);
	if(fd < 0){
		perror(MODEMDEVICE);
		exit(-1);
	}

	tcgetattr(fd, &oldtio);
	bzero(&newtio, sizeof(newtio));
	newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
	newtio.c_iflag = IGNPAR | ICRNL;
	newtio.c_oflag = /*OPOST | OCRNL*/0;
	newtio.c_lflag = ICANON;

	newtio.c_cc[VINTR]	= 0;
	newtio.c_cc[VQUIT]	= 0;
	newtio.c_cc[VERASE]	= 0;
	newtio.c_cc[VKILL]	= 0;
	newtio.c_cc[VEOF]	= 4;
	newtio.c_cc[VTIME]	= 0;
	newtio.c_cc[VMIN]	= 1;
	newtio.c_cc[VSWTC]	= 0;
	newtio.c_cc[VSTART]	= 0;
	newtio.c_cc[VSTOP]	= 0;
	newtio.c_cc[VSUSP]	= 0;
	newtio.c_cc[VEOL]	= 0;
	newtio.c_cc[VREPRINT]	= 0;
	newtio.c_cc[VDISCARD]	= 0;
	newtio.c_cc[VWERASE]	= 0;
	newtio.c_cc[VLNEXT]	= 0;
	newtio.c_cc[VEOL2]	= 0;

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

	while(STOP == FALSE){
		printf("Input : ");
		scanf("%s", buf);
		res = send(fd, buf, 255, 0);
		buf[res] = 0;
		printf("W_BUF : %s | W_RES : %d\n\n", buf, res);
		if(buf[0] == 'z')
			STOP = TRUE;

	}
	tcsetattr(fd, TCSANOW, &oldtio);
}
mooore의 이미지

serial 통신에 send 써도 상관이 없는건가요? (이건 제가 오히려 질문하는겁니다.)
man page에는 send a message from a socket라고 되어 있는데요.
소켓도 그렇고 시리얼도 그렇고 write를 쓰시면 됩니다.

그리고 buf를 키보드로부터 입력받지 마시고 임의의 문자열을 보냈을 때 결과가 어떻게 되는지 확인해보세요.

그럼.

별은 바라보는 자에게 빛을 준다.

phoino20의 이미지

Write로 했고요 buf에 문자열을 넣어서 해봤는데 안넘어 가네요;
먼가 다른 방법은 없는건가요?

phoino20의 이미지

흠.. 통신 설정하는 부분옵션을 좀 고치니까 가긴 가는데 처음 입력만 제대로 가고 그 담부터는 계속 이상한 문자로 받는군요. 거기다 버퍼가 255로 잡혀 있는데도 10단어 이상 정도 넣으면 받는 쪽에서 멈춰 버리는 군요.(받는 쪽은 위와 거의 같은데 read로 받는 것만 달라요.)