#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "GPIOControl.h" #include "SerialComm.h" static void set_baudrate (struct termios *opt, unsigned int baudrate) { cfsetispeed(opt, baudrate); cfsetospeed(opt, baudrate); } static void set_data_bit (struct termios *opt, unsigned int databit) { opt->c_cflag &= ~CSIZE; switch (databit) { case 8: opt->c_cflag |= CS8; break; case 7: opt->c_cflag |= CS7; break; case 6: opt->c_cflag |= CS6; break; case 5: opt->c_cflag |= CS5; break; default: opt->c_cflag |= CS8; break; } } static void set_parity (struct termios *opt, char parity) { switch (parity) { case'N':/* 无校验 */ case 'n': opt->c_cflag &= ~PARENB; break; case'E':/*偶校验*/ case 'e': opt->c_cflag |= PARENB; opt->c_cflag &= ~PARODD; break; case'O':/* 奇校验 */ case 'o': opt->c_cflag |= PARENB; opt->c_cflag |= ~PARODD; break; default: /*其它选择为无校验 */ opt->c_cflag &= ~PARENB; break; } } static void set_stopbit (struct termios *opt, const int stopbit) { switch (stopbit) { case 10: opt->c_cflag &= ~CSTOPB;/*1 位停止位 t */ break; case 15: opt->c_cflag &= ~CSTOPB;/*1.5 位停止位 */ break; case 20: opt->c_cflag |= CSTOPB; /*2 位停止位 */ break; default: opt->c_cflag &= ~CSTOPB; /*1 位停止位 */ break; } } int set_port_attr (int fd, unsigned int baudrate, int databit, const int stopbit, char parity, int vtime, int vmin ) { struct termios opt; tcgetattr(fd, &opt); set_baudrate(&opt, baudrate); //opt.c_cflag |= CLOCAL|CREAD; /*|CRTSCTS */ opt.c_lflag &= ~(ICANON | ECHO |ECHOE |ISIG); set_data_bit(&opt, databit); set_parity(&opt, parity); set_stopbit(&opt, stopbit); opt.c_iflag &=~(INLCR|ICRNL); opt.c_iflag &=~(IXON);/* 流控*/ opt.c_oflag = 0; //opt.c_lflag |= 0; opt.c_oflag &= ~OPOST; opt.c_cc[VTIME] = vtime; opt.c_cc[VMIN] = vmin; tcflush (fd, TCIFLUSH); return (tcsetattr (fd, TCSANOW, &opt)); }