#include #include #include #include #include #include // File control definitions #include // Posix terminal control definitions #include // close() #define SIZEOF_ARRAY(array) (sizeof(array)/sizeof(array[0])) int OpenSerial(const char *dev) { int fd; struct termios serdev; fd = open(dev, O_RDWR | O_NOCTTY | O_NONBLOCK); if (fd == -1) { return -1; } tcgetattr(fd, &serdev); // Set the Baud Rate (115200) cfsetispeed(&serdev, B115200); cfsetospeed(&serdev, B115200); // Enable receiver serdev.c_cflag |= (CLOCAL | CREAD); // Set the parity (NONE) serdev.c_cflag &= ~(PARENB | PARODD); serdev.c_iflag &= ~(INPCK | ISTRIP | IGNPAR | PARMRK); // Set the stop bits (1) serdev.c_cflag &= ~CSTOPB; // Set the databits (8) serdev.c_cflag &= ~CSIZE; serdev.c_cflag |= CS8; // Set the flow control (RTS/CTS). No SW Handshake serdev.c_cflag |= CRTSCTS; serdev.c_iflag &= ~(IXON | IXOFF | IXANY); // Set everything else serdev.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // Raw input serdev.c_oflag &= ~OPOST; // Raw output serdev.c_cc[VMIN] = 0; serdev.c_cc[VTIME] = 2; tcsetattr(fd, TCSANOW, &serdev); fcntl(fd, F_SETFL, 0); return fd; } int WriteSerial(int fd, const char *buff, size_t len, size_t *off) { ssize_t r; if (*off >= len) return -1; printf("Writing\n"); r = write(fd, buff+ *off, len - *off); printf("Written %d\n", r); if (r < 0) return -2; *off += r; return r; } int main(void) { char writestr[] = "This is a test. We're testing Cygwin writes\n"; size_t off = 0; int fdSerial; int result; fd_set setRead; fd_set setWrite; fdSerial = OpenSerial("/dev/com2"); if (fdSerial < 0) return EXIT_FAILURE; for (;;) { FD_ZERO(&setRead); FD_ZERO(&setWrite); FD_SET(fdSerial, &setWrite); result = select(fdSerial+1, &setRead, &setWrite, NULL, NULL); if (result < 0) { printf("Select() returned error\n"); close(fdSerial); return EXIT_FAILURE; } if (FD_ISSET(fdSerial, &setWrite)) { WriteSerial(fdSerial, writestr, SIZEOF_ARRAY(writestr)-1, &off); if (off == SIZEOF_ARRAY(writestr)-1) off = 0; } } }