@ -8,86 +8,74 @@
# include <termios.h>
# include <unistd.h>
static int set_interface_attribs ( int fd , int speed , int parity )
static int set_interface_attribs ( int fd )
{
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 ;
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 ) __MAX_BAUD ) ;
cfsetispeed ( & tty , ( speed_t ) __MAX_BAUD ) ;
tty . c_cflag = CLOCAL | CREAD | CS8 ; // 8-bit chars
tty . c_iflag = 0 ;
tty . c_lflag = 0 ;
tty . c_oflag = 0 ;
tty . c_cc [ VMIN ] = 0 ; // read doesn't block
tty . c_cc [ VTIME ] = 2 ; // 0.2 seconds read timeout
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 ;
}
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 ) ;
set_interface_attribs ( fd ) ;
return fd ;
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 ) ;
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 ) ;
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 ) ;
}