#include "serial_io.h" struct termios toptions; void sWrite(int port, char string[], size_t length) { if(port != -1) write(port, string, length); } void sWrite(int port, const char string[], size_t length) { if(port != -1) write(port, string, length); } ssize_t sRead(int port, void *buf, size_t count) { return (port != -1) ? read(port, buf, count) : 0; } int serialport_init(const char* device, int baud) { int fd; fd = open(device, O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) { perror("init_serialport: Unable to open port "); return -1; } if (tcgetattr(fd, &toptions) < 0) { perror("init_serialport: Couldn't get term attributes"); return -1; } // 8N1 toptions.c_cflag &= ~PARENB; toptions.c_cflag &= ~CSTOPB; toptions.c_cflag &= ~CSIZE; toptions.c_cflag |= CS8; // no flow control toptions.c_cflag &= ~(CRTSCTS | CLOCAL); //Make Raw toptions.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON); toptions.c_oflag &= ~OPOST; toptions.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); toptions.c_cflag &= ~(CSIZE | PARENB); toptions.c_cflag |= CS8; cfsetispeed(&toptions, baud); cfsetospeed(&toptions, baud); // see: http://unixwiz.net/techtips/termios-vmin-vtime.html toptions.c_cc[VMIN] = 0; toptions.c_cc[VTIME] = 40; fcntl(fd, F_SETFL, FNDELAY); if( tcsetattr(fd, TCSANOW, &toptions) < 0) { perror("init_serialport: Couldn't set term attributes"); return -1; } return fd; }