#include "serial.h" #include #include #include #include #include #include #include static int set_interface_attribs(int fd, int speed, int parity) { struct termios tty; memset(&tty, 0, sizeof tty); if (tcgetattr(fd, &tty) != 0) { printf("error %d from tcgetattr\n", errno); return -1; } cfsetospeed(&tty, (speed_t) speed); cfsetispeed(&tty, (speed_t) speed); tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; // 8-bit chars // disable IGNBRK for mismatched speed tests; otherwise receive break // as \000 chars tty.c_iflag &= ~IGNBRK; // disable break processing tty.c_lflag = 0; // no signaling chars, no echo, // no canonical processing tty.c_oflag = 0; // no remapping, no delays tty.c_cc[VMIN] = 0; // read doesn't block tty.c_cc[VTIME] = 2; // 0.2 seconds read timeout tty.c_iflag &= ~(IXON | IXOFF | IXANY); // shut off xon/xoff ctrl tty.c_cflag |= (CLOCAL | CREAD);// ignore modem controls, // enable reading tty.c_cflag &= ~(PARENB | PARODD); // shut off parity tty.c_cflag |= parity; tty.c_cflag &= ~CSTOPB; tty.c_cflag &= ~CRTSCTS; if (tcsetattr(fd, TCSANOW, &tty) != 0) { printf("error %d from tcsetattr\n", errno); return -1; } return 0; } int serial_open(const char *device) { int fd = open (device, O_RDWR | O_NOCTTY | O_SYNC); if (fd < 0) { fprintf (stderr, "FAILED TO OPEN SERIAL! Error %d opening %s: %s\n", errno, device, strerror (errno)); return -1; } set_interface_attribs(fd, B115200, 0); return fd; } void serial_noblock(int fd) { struct termios tty; memset(&tty, 0, sizeof tty); if (tcgetattr(fd, &tty) != 0) { fprintf(stderr, "error %d from tggetattr\n", errno); return; } tty.c_cc[VMIN] = (cc_t) 0; tty.c_cc[VTIME] = (cc_t) 0; if (tcsetattr(fd, TCSANOW, &tty) != 0) fprintf(stderr, "error %d setting term attributes\n", errno); } void serial_shouldwait(int fd, int ms) { struct termios tty; memset(&tty, 0, sizeof tty); if (tcgetattr(fd, &tty) != 0) { fprintf(stderr, "error %d from tggetattr\n", errno); return; } tty.c_cc[VMIN] = (cc_t) 0; tty.c_cc[VTIME] = (cc_t) (ms+50/100); if (tcsetattr(fd, TCSANOW, &tty) != 0) fprintf(stderr, "error %d setting term attributes\n", errno); }