diff options
Diffstat (limited to 'src/serialport/serialport_class_lin.cc')
-rw-r--r-- | src/serialport/serialport_class_lin.cc | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/src/serialport/serialport_class_lin.cc b/src/serialport/serialport_class_lin.cc index ce34aa6..8ad192e 100644 --- a/src/serialport/serialport_class_lin.cc +++ b/src/serialport/serialport_class_lin.cc @@ -86,6 +86,10 @@ octave_serialport::open (const std::string &path) config.c_cc[VMIN] = 0; config.c_cc[VTIME] = 5; + // set an intial baudrate + cfsetospeed (&config, B9600); + cfsetispeed (&config, B9600); + if (tcsetattr (fd, TCSANOW, &config) < 0) { error ("serialport: Failed to set default terminal attributes: %s\n", strerror (errno)); @@ -148,6 +152,10 @@ octave_serialport::read (uint8_t *buf, unsigned int len) // Timeout while in non-blocking mode if (read_retval == 0 && !blocking_read) { + // no waiting + if (config.c_cc[VTIME] == 0) + break; + maxwait -= (double)config.c_cc[VTIME]/10.0; // actual timeout @@ -220,19 +228,19 @@ octave_serialport::set_timeout (double newtimeout) else { blocking_read = false; - if(newtimeout > 10) newtimeout = 5; - if(newtimeout < 1) newtimeout = 1; + if(newtimeout > 5) newtimeout = 5; } - - BITMASK_CLEAR (config.c_lflag, ICANON); // Set non-canonical mode - config.c_cc[VMIN] = 0; - config.c_cc[VTIME] = (unsigned) newtimeout; - - if (tcsetattr (fd, TCSANOW, &config) < 0) + if (config.c_cc[VTIME] != (unsigned char) newtimeout) { - error ("serialport: error setting timeout..."); - return -1; + config.c_cc[VMIN] = 0; + config.c_cc[VTIME] = (unsigned char) newtimeout; + + if (tcsetattr (fd, TCSANOW, &config) < 0) + { + error ("serialport: error setting timeout..."); + return -1; + } } return 1; @@ -463,8 +471,8 @@ octave_serialport::set_baudrate (unsigned int baud) return false; } - cfsetispeed (&config, baud_rate); cfsetospeed (&config, baud_rate); + cfsetispeed (&config, baud_rate); if (tcsetattr (fd, TCSANOW, &config) < 0) { @@ -486,7 +494,7 @@ octave_serialport::get_baudrate (void) const int retval = -1; - speed_t baudrate = cfgetispeed (&config); + speed_t baudrate = cfgetospeed (&config); if (baudrate == B0) retval = 0; |