멀티 시리얼 통신에 대해서 질문 드립니다.
글쓴이: cdcmp / 작성시간: 토, 2005/01/08 - 9:24오후
com1, com2, com3 포트 세개를 사용하여 멀티 시리얼 통신을 하고 있습니다.
우선 소스는 다음과 같습니다.
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <termios.h> #include <stdio.h> #include <unistd.h> #include <sys/time.h> #include <sys/ioctl.h> #include <iostream> #define SERIALDEVICE_com1 "/dev/ttyMP1" #define SERIALDEVICE_com2 "/dev/ttyMP2" #define SERIALDEVICE_com3 "/dev/ttyMP3" #define BAUDRATE_com1 B9600 #define BAUDRATE_com2 B115200 #define BAUDRATE_com3 B115200 int nread, result; int max_fd; int fd_com1, fd_com2, fd_com3; struct termios oldtio_com1, oldtio_com2, oldtio_com3, newtio_com1, newtio_com2, newtio_com3; struct timeval timeout; fd_set readfs; fd_com1 = open(SERIALDEVICE_com1,O_RDWR|O_NOCTTY); fd_com2 = open(SERIALDEVICE_com2,O_RDWR|O_NOCTTY); fd_com3 = open(SERIALDEVICE_com3,O_RDWR|O_NOCTTY); if(fd_com1<0) { printf("file open error\n"); perror(SERIALDEVICE_com1); } if(fd_com2<0) { printf("file open error\n"); perror(SERIALDEVICE_com2); } if(fd_com3<0) { printf("file open error\n"); perror(SERIALDEVICE_com3); } tcgetattr(fd_com1,&oldtio_com1); bzero(&newtio_com1, sizeof(newtio_com1)); newtio_com1.c_cflag= (CS8+BAUDRATE_com1+CREAD+CLOCAL+HUPCL); newtio_com1.c_lflag &= ~ICANON; newtio_com1.c_iflag = IGNPAR | ICRNL; newtio_com1.c_oflag = 0; tcflush(fd_com1, TCIFLUSH); tcsetattr(fd_com1,TCSANOW,&newtio_com1); tcgetattr(fd_com2,&oldtio_com2); bzero(&newtio_com2, sizeof(newtio_com2)); newtio_com2.c_cflag= (CS8+BAUDRATE_com2+CREAD+CLOCAL+HUPCL); newtio_com2.c_lflag &= ~ICANON; newtio_com2.c_iflag = IGNPAR | ICRNL; newtio_com2.c_oflag = 0; tcflush(fd_com2, TCIFLUSH); tcsetattr(fd_com2,TCSANOW,&newtio_com2); tcgetattr(fd_com3,&oldtio_com3); bzero(&newtio_com3, sizeof(newtio_com3)); newtio_com3.c_cflag= (CS8+BAUDRATE_com3+CREAD+CLOCAL+HUPCL); newtio_com3.c_lflag &= ~ICANON; newtio_com3.c_iflag = IGNPAR | ICRNL; newtio_com3.c_oflag = 0; tcflush(fd_com3, TCIFLUSH); tcsetattr(fd_com3,TCSANOW,&newtio_com3); timeout.tv_usec = 0; /* 0.1milliseconds */ timeout.tv_sec = 0; /* seconds */ FD_ZERO(&readfs); FD_SET(fd_com1,&readfs); FD_SET(fd_com2,&readfs); FD_SET(fd_com3,&readfs); max_fd = MAX (fd_com1, fd_com2, fd_com3)+1; result = select(max_fd, &readfs, NULL, NULL, &timeout); switch(result) { case 0: printf("timeout\n"); break; case -1: perror("select"); exit(1); default: if(FD_ISSET(fd_com1, &readfs)) { ioctl(fd_com1,FIONREAD,&nread); nread = read(fd_com1,&rx_buf[i],1); } } switch(result) { case 0: printf("timeout\n"); break; case -1: perror("select"); exit(1); default: if(FD_ISSET(fd_com2, &readfs)) { ioctl(fd_com2,FIONREAD,&nread); nread = read(fd_com2,&rx_buf[i],1); } } switch(result) { case 0: printf("timeout\n"); break; case -1: perror("select"); exit(1); default: if(FD_ISSET(fd_com3, &readfs)) { ioctl(fd_com3,FIONREAD,&nread); nread = read(fd_com3,&rx_buf[i],1); } }
여기서
max_fd = MAX (fd_com1, fd_com2, fd_com3)+1;
이렇게 정의를 해주는데....
MAX는 어떻게 정의를 해주어야 하는지요??
그리고 서로 다른 com port에서 baudrate설정과 멀티 시리얼 통신 을 하기 위해서 위의 소스와 같이 해주면 되는지...
MAX정의하는데서 에러가 나서 아직 위의 소스가 되는지 안되는지도 모르겠네요...ㅜ ㅜ
Forums:
어떻게 정의하셨는데요? 수학의 max와 다르지 않습니다.
어떻게 정의하셨는데요? 수학의 max와 다르지 않습니다.
위의 소스데로 해서 컴파일 하니까 MAX가 정의 되어 있지 않다고 컴파일
위의 소스데로 해서 컴파일 하니까 MAX가 정의 되어 있지 않다고 컴파일 에러가 나서요...
수학의 MAX와 다르지 않다면 그게 어떤 의미인지...
에궁....
다시 한번 답변 부탁 드립니다...^^
MAX()는 입력된 모든 정수의 최대값을 구하면 됩니다.그렇게 작성하
MAX()는 입력된 모든 정수의 최대값을 구하면 됩니다.
그렇게 작성하세요.
보통 2개의 파라메터로 보이는게(예제등등에서) 대부분이지만, 여기서는 단지 파라메터가 3개일뿐입니다.
* 왜? 이런걸 하나? select()함수를 공부하셔야 겠습니다.
댓글 달기