#include "drv_uart.h" int drv_uart_open(char *dev, int32_t baudrate, int32_t databit, char parity, char stopbit) { int devFd = open(dev, O_RDWR | O_NONBLOCK| O_NOCTTY | O_NDELAY); if(devFd == -1) { printf("open uart failed\n"); } else { struct termios oldtio, newtio; memset(&newtio, 0, sizeof(newtio)); speed_t speed; switch (baudrate) { case 9600: speed = B9600; break; case 38400: speed = B38400; break; case 115200: speed = B115200; break; default: speed = B115200; break; } switch (databit) { case 8: newtio.c_cflag |= CS8; break; case 7: newtio.c_cflag |= CS7; break; case 6: newtio.c_cflag |= CS6; break; case 5: newtio.c_cflag |= CS5; break; default: newtio.c_cflag |= CS8; break; } switch (parity) { case 'N': newtio.c_cflag &= ~PARENB; break; case 'E': newtio.c_cflag |= PARENB; newtio.c_cflag &= ~PARODD; break; case 'O': newtio.c_cflag |= (PARENB | PARODD); break; default: newtio.c_cflag &= ~PARENB; break; } switch (stopbit) { case '1': newtio.c_cflag &= ~CSTOPB; break; case '2': newtio.c_cflag |= CSTOPB; default: newtio.c_cflag &= ~CSTOPB; break; } newtio.c_cflag |= (CLOCAL | CREAD); /* | CRTSCTS */ newtio.c_oflag &= ~OPOST; newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); newtio.c_cc[VTIME] = 1; /* unit: 1/10 second. */ newtio.c_cc[VMIN] = 255; /* minimal characters for reading */ tcflush(devFd, TCIFLUSH); tcsetattr(devFd, TCSANOW, &newtio); } return devFd; }