지금.. Com 포트에 데이터 쓰고 읽기..
글쓴이: leolo / 작성시간: 화, 2003/07/22 - 9:21오전
ttyS0에다 데이터를 쓰고 ttyS1에서 데이터를 읽어 파일에다가
적는 걸 테스트하고 있습니다.
ttyS0은 flow control을 사용하지 않고 데이터를 읽정 시간 간격으로
계속해서 보내고, ttyS1은 h/w flow control을 사용합니다.
1. 일정시간 간격으로 흐름제어를 하지 않는 ttyS0에 데이터를 쓰는게
가능한지.. 아래와 같이 하면 되는지 알고 싶습니다. 지금 코드는 그냥
한번만 쓰게 되어있거든요.. 라이트 하는 부분을 어떻게 수정하면
일정한 간격이 되는지 알고 싶습니다. usleep하면 되는지..
아참.. 일정한 간격으로 쓸때.. 시간은 정밀해야합니다.(마이크로초)
2. 다음으로 두번째.. 코드가 올바른지 알고 싶습니다.
현재 테스트 환경은 무선으로 연결된 상태입니다.
ttyS0 ------> 무선 ------>ttyS1
/****************************** * "/dev/ttyS0" * RS232 interface write Data. ******************************/ #include <stdio.h> #include <unistd.h> #include <termios.h> #include <fcntl.h> #include <errno.h> #include "serial.h" #include "buf.h" int serial_open(const char *device, int baud, int flow) { int fd; static long baudrate; struct termios tio; fd = open(device, O_RDWR | O_NOCTTY | O_NONBLOCK, 0644); if(fd < 0) { dbg("Can't open device %s\n", device); return -1; } else { dbg("Open %s Device, fd %d : \n", device, fd); bzero(&tio, sizeof(tio)); switch(baud) { case 9600: baudrate = B9600; break; case 19200: baudrate = B19200; break; default : dbg("Can't define %d\n", baud); close(fd); exit(0); } /* end switch */ tio.c_cflag &= ~CSIZE; tio.c_cflag |= CS8; /* 8 data bit */ tio.c_cflag &= ~CSTOPB; /* 1 stop bit */ tio.c_cflag &= ~(PARENB | PARODD); /* no parity bit */ if(flow){ tio.c_cflag |= CRTSCTS; /* h/w flow control */ } else{ tio.c_cflag &= ~CRTSCTS; /* no flow control */ } if((cfsetispeed(&tio, baudrate) < 0 || cfsetospeed(&tio, baudrate) < 0)){ /* baudrate set */ dbg("Can't set baudrate\n"); close(fd); return -1; } else { if(tcsetattr(fd, TCSANOW, &tio) < 0){ /* termios set */ dbg("Can't set Termios struct\n"); close(fd); return -1; } else { if(tcflush(fd, TCIOFLUSH) < 0){ close(fd); return -1; } } } } return fd; } int serial_write(int fd, char *buf, int size) { int t = 0; int ones; int writesize; writesize = size; while(writesize > 0) { ones = write(fd, buf, writesize); if(ones <= 0) { if(errno == EINTR || errno == EAGAIN){ dbg("Error write serail : %d\n", errno); exit(0); } } else { buf += ones; writesize -= ones; t += ones; } } return t; } int serial_stat(int fd){ struct termios stio; tcgetattr(fd, &stio); if(stio.c_cflag & B9600) printf("9600 B/S,"); else if(stio.c_cflag & B19200) printf("19200 B/S,"); else printf("Not B/S,"); if(stio.c_cflag & CRTSCTS) printf("h/w F/C,"); else if(stio.c_cflag & ~CRTSCTS) printf("none F/C,"); else printf("s/w F/C,"); if(stio.c_cflag & CS8) printf("8 D/B,"); else printf("Not D/B,"); if(stio.c_cflag & ~CSTOPB) printf("1 S/T,"); else printf("2 S/T,"); if(stio.c_cflag & ~(PARENB|PARODD)) printf("no P/B\n"); else printf("P/B\n"); } int usage(const char *device) { printf("serial_write - RS232 write Data. copyright(c)2003 by leolo\n"); printf("description : RS232(%s) write data\n", device); printf("serial_write baudrate <flow/none> byte time count\n"); exit(0); } int main(int argc, char *argv[]) { int baud; int flow; int fd; int n; const char *device = "/dev/ttyS0"; int size; int tdata = 0; if(argc != 4) usage(device); baud = atoi(argv[1]); if(strncmp(argv[2], "flow", 4) == 0) flow = 1; /* h/w flow control */ else flow = 0; /* no flow control */ size = atoi(argv[3]); fd = serial_open(device, baud, flow); serial_stat(fd); n = serial_write(fd, buf, size); tdata += n; dbg("Send data total %d\n", tdata); close(fd); return 0; }
/****************************** * "/dev/ttyS1" * RS232 interface read Data. ******************************/ #include <stdio.h> #include <unistd.h> #include <termios.h> #include <fcntl.h> #include <errno.h> #include "serial.h" int serial_open(const char *device, int baud, int flow) { int fd; static long baudrate; struct termios tio; fd = open(device, O_RDWR | O_NOCTTY | O_NONBLOCK, 0644); if(fd < 0) { dbg("Can't open device %s\n", device); return -1; } else { dbg("Open %s Device, fd %d : \n", device, fd); bzero(&tio, sizeof(tio)); switch(baud) { case 9600: baudrate = B9600; break; case 19200: baudrate = B19200; break; default : dbg("Can't define %d\n", baud); close(fd); exit(0); } /* end switch */ tio.c_cflag &= ~CSIZE; tio.c_cflag |= CS8; /* 8 data bit */ tio.c_cflag &= ~CSTOPB; /* 1 stop bit */ tio.c_cflag &= ~(PARENB | PARODD); /* no parity bit */ tio.c_cflag |= CREAD; if(flow){ tio.c_cflag |= CRTSCTS; /* h/w flow control */ } else{ tio.c_cflag &= ~CRTSCTS; /* no flow control */ } if((cfsetispeed(&tio, baudrate) < 0 || cfsetospeed(&tio, baudrate) < 0)){ /* baudrate set */ dbg("Can't set baudrate\n"); close(fd); return -1; } else { if(tcsetattr(fd, TCSANOW, &tio) < 0){ /* termios set */ dbg("Can't set Termios struct\n"); close(fd); return -1; } else { if(tcflush(fd, TCIOFLUSH) < 0){ close(fd); return -1; } } } } return fd; } int serial_write(int fd, char *buf, int size) { int t = 0; int ones; int writesize; writesize = size; while(writesize > 0) { ones = write(fd, buf, writesize); if(ones <= 0) { if(errno == EINTR || errno == EAGAIN){ dbg("Error write serail : %d\n", errno); exit(0); } } else { buf += ones; writesize -= ones; t += ones; } } return t; } int serial_read(int fd, char *buff, int size) { fd_set rfds; int filefd; int result, isread, readsize; char buffer[2048]; filefd = open("./serial.out", O_RDWR | O_CREAT | O_TRUNC, 0644); while(1){ FD_ZERO(&rfds); FD_SET(fd, &rfds); printf("select pending\n"); result = select(fd + 1, &rfds, (fd_set *)0, (fd_set *)0, NULL); if(result <= 0){ dbg("select error\n"); exit(0); } isread = FD_ISSET(fd, &rfds); if(result > 0 && isread != 0){ memset(buffer, '\0', sizeof(buffer)); readsize = read(fd, buffer, size); if(readsize > 0) { printf("read data %d byte -> %s\n", readsize, buffer); write(filefd, buffer, readsize); } else { if(readsize <= 0){ dbg("Can't read\n"); exit(0); } break; } } else { close(filefd); break; } } return -1; } int serial_stat(int fd){ struct termios stio; tcgetattr(fd, &stio); if(stio.c_cflag & B9600) printf("9600 B/S,"); else if(stio.c_cflag & B19200) printf("19200 B/S,"); else printf("Not B/S,"); if(stio.c_cflag & CRTSCTS) printf("h/w F/C,"); else if(stio.c_cflag & ~CRTSCTS) printf("none F/C,"); else printf("s/w F/C,"); if(stio.c_cflag & CS8) printf("8 D/B,"); else printf("Not D/B,"); if(stio.c_cflag & ~CSTOPB) printf("1 S/T,"); else printf("2 S/T,"); if(stio.c_cflag & ~(PARENB|PARODD)) printf("no P/B\n"); else printf("P/B\n"); } int main(int argc, char *argv[]) { int baud; int flow; int fd; int n; char *buf; const char *device = "/dev/ttyS1"; int size = 2048; bzero(buf, sizeof(buf)); flow = 1; /* h/w flow control */ baud = 9600; /* baud rate */ fd = serial_open(device, baud, flow); serial_stat(fd); n = serial_read(fd, buf, size); close(fd); return 0; }[/code]
Forums:
댓글 달기