int ser_setup( ser_handler id, u32 baud, int databits, int parity, int stopbits ) { struct termios termdata; int hnd = ( int )id; usleep( 200000 ); tcgetattr( hnd, &termdata ); // Baud rate cfsetispeed( &termdata, ser_baud_to_id( baud ) ); cfsetospeed( &termdata, ser_baud_to_id( baud ) ); // Parity / stop bits termdata.c_cflag &= ~CSTOPB; if( parity == SER_PARITY_NONE ) // no parity { termdata.c_cflag &= ~PARENB; } else if( parity == SER_PARITY_EVEN ) // even parity { termdata.c_cflag |= PARENB; termdata.c_cflag &= ~PARODD; } else if( parity == SER_PARITY_ODD ) // odd parity { termdata.c_cflag |= PARENB; termdata.c_cflag |= PARODD; } // Data bits termdata.c_cflag |= ( CLOCAL | CREAD ); termdata.c_cflag &= ~CSIZE; termdata.c_cflag |= ser_number_of_bits_to_id( databits ); // Disable HW and SW flow control termdata.c_cflag &= ~CRTSCTS; termdata.c_iflag &= ~( IXON | IXOFF | IXANY ); // Raw input termdata.c_lflag &= ~( ICANON | ECHO | ECHOE | ISIG ); // Raw output termdata.c_oflag &= ~OPOST; // Check and strip parity bit if( parity == SER_PARITY_NONE ) termdata.c_iflag &= ~( INPCK | ISTRIP ); else termdata.c_iflag |= ( INPCK | ISTRIP ); // Setup timeouts termdata.c_cc[ VMIN ] = 1; termdata.c_cc[ VTIME ] = 0; // Set the attibutes now tcsetattr( hnd, TCSANOW, &termdata ); // Flush everything tcflush( hnd, TCIOFLUSH ); // And set blocking mode by default fcntl( id, F_SETFL, 0 ); }
int ser_setup( ser_handler id, uint32_t baud, int databits, int parity, int stopbits ) { struct termios termdata; struct timespec tsleep; int hnd = ( int )id; tsleep.tv_sec = 0; tsleep.tv_nsec = 200000000; nanosleep( &tsleep, NULL ); tcgetattr( hnd, &termdata ); // Baud rate cfsetispeed( &termdata, ser_baud_to_id( baud ) ); cfsetospeed( &termdata, ser_baud_to_id( baud ) ); // Parity / stop bits if ( stopbits == SER_STOPBITS_2) { termdata.c_cflag |= CSTOPB; } else { termdata.c_cflag &= ~CSTOPB; } if( parity == SER_PARITY_NONE ) // no parity { termdata.c_cflag &= ~PARENB; } else if( parity == SER_PARITY_EVEN ) // even parity { termdata.c_cflag |= PARENB; termdata.c_cflag &= ~PARODD; } else if( parity == SER_PARITY_ODD ) // odd parity { termdata.c_cflag |= PARENB; termdata.c_cflag |= PARODD; } // Data bits termdata.c_cflag |= ( CLOCAL | CREAD ); termdata.c_cflag &= ~CSIZE; termdata.c_cflag |= ser_number_of_bits_to_id( databits ); // Disable HW and SW flow control #if defined( CRTSCTS ) // not available on all platforms, use if available termdata.c_cflag &= ~CRTSCTS; #endif termdata.c_iflag &= ~( IXON | IXOFF | IXANY ); // Raw input termdata.c_lflag &= ~( ICANON | ECHO | ECHOE | ISIG ); // Raw output termdata.c_oflag &= ~OPOST; // Check and strip parity bit if needed if( parity == SER_PARITY_NONE ) termdata.c_iflag &= ~( INPCK | ISTRIP ); else termdata.c_iflag |= ( INPCK | ISTRIP ); // Set the attibutes now tcsetattr( hnd, TCSANOW, &termdata ); // Flush everything tcflush( hnd, TCIOFLUSH ); // And set blocking mode by default fcntl( id, F_SETFL, 0 ); return SER_OK; }