From 2ae490b3ac25464937b0f0d8536cc86456e1fe97 Mon Sep 17 00:00:00 2001 From: William Woodall Date: Tue, 12 Jun 2012 16:55:11 -0500 Subject: [PATCH] Fixes to flowcontrol that solve a wierd bug on Linux and fix an oversight on Windows. --- include/serial/serial.h | 3 ++- src/impl/unix.cc | 14 +++++++++++++- src/impl/win.cc | 20 ++++++++++++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/include/serial/serial.h b/include/serial/serial.h index c1b2560..ec44d05 100644 --- a/include/serial/serial.h +++ b/include/serial/serial.h @@ -83,7 +83,8 @@ typedef enum { */ typedef enum { flowcontrol_none = 0, - flowcontrol_software + flowcontrol_software, + flowcontrol_hardware } flowcontrol_t; /*! diff --git a/src/impl/unix.cc b/src/impl/unix.cc index dac0f4e..c25e339 100755 --- a/src/impl/unix.cc +++ b/src/impl/unix.cc @@ -49,7 +49,7 @@ Serial::SerialImpl::SerialImpl (const string &port, unsigned long baudrate, bytesize_t bytesize, parity_t parity, stopbits_t stopbits, flowcontrol_t flowcontrol) - : port_ (port), fd_ (-1), is_open_ (false), xonxoff_ (true), rtscts_ (false), + : port_ (port), fd_ (-1), is_open_ (false), xonxoff_ (false), rtscts_ (false), baudrate_ (baudrate), parity_ (parity), bytesize_ (bytesize), stopbits_ (stopbits), flowcontrol_ (flowcontrol) { @@ -282,6 +282,18 @@ Serial::SerialImpl::reconfigurePort () throw invalid_argument ("invalid parity"); } // setup flow control + if (flowcontrol_ == flowcontrol_none) { + xonxoff_ = false; + rtscts_ = false; + } + if (flowcontrol_ == flowcontrol_software) { + xonxoff_ = true; + rtscts_ = false; + } + if (flowcontrol_ == flowcontrol_hardware) { + xonxoff_ = false; + rtscts_ = true; + } // xonxoff #ifdef IXANY if (xonxoff_) diff --git a/src/impl/win.cc b/src/impl/win.cc index 63fcc3b..25dffee 100644 --- a/src/impl/win.cc +++ b/src/impl/win.cc @@ -213,6 +213,26 @@ Serial::SerialImpl::reconfigurePort () throw invalid_argument ("invalid parity"); } + // setup flowcontrol + if (flowcontrol_ == flowcontrol_none) { + dcbSerialParams.fOutxCtsFlow = false; + dcbSerialParams.fRtsControl = 0x00; + dcbSerialParams.fOutX = false; + dcbSerialParams.fInX = false; + } + if (flowcontrol_ == flowcontrol_software) { + dcbSerialParams.fOutxCtsFlow = false; + dcbSerialParams.fRtsControl = 0x00; + dcbSerialParams.fOutX = true; + dcbSerialParams.fInX = true; + } + if (flowcontrol_ == flowcontrol_hardware) { + dcbSerialParams.fOutxCtsFlow = true; + dcbSerialParams.fRtsControl = 0x03; + dcbSerialParams.fOutX = false; + dcbSerialParams.fInX = false; + } + // activate settings if(!SetCommState(fd_, &dcbSerialParams)){ THROW (IOException, "Error setting serial port settings.");