Skip to content

Commit

Permalink
Fixes to flowcontrol that solve a wierd bug on Linux and fix an overs…
Browse files Browse the repository at this point in the history
…ight on Windows.
  • Loading branch information
wjwwood committed Jun 12, 2012
1 parent 9579006 commit 2ae490b
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 2 deletions.
3 changes: 2 additions & 1 deletion include/serial/serial.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,8 @@ typedef enum {
*/
typedef enum {
flowcontrol_none = 0,
flowcontrol_software
flowcontrol_software,
flowcontrol_hardware
} flowcontrol_t;

/*!
Expand Down
14 changes: 13 additions & 1 deletion src/impl/unix.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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_)
Expand Down
20 changes: 20 additions & 0 deletions src/impl/win.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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.");
Expand Down

0 comments on commit 2ae490b

Please sign in to comment.