summaryrefslogtreecommitdiff
path: root/src/serialport/serialport_class_lin.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/serialport/serialport_class_lin.cc')
-rw-r--r--src/serialport/serialport_class_lin.cc32
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;