mirror of
https://github.com/wjwwood/serial.git
synced 2026-01-22 19:54:57 +08:00
Merge f08466accaa2f8fd49f1fdacfe15cc02e2e32fd3 into 69e0372cf0d3796e84ce9a09aff1d74496f68720
This commit is contained in:
commit
bd08003297
@ -70,7 +70,8 @@ public:
|
|||||||
bytesize_t bytesize,
|
bytesize_t bytesize,
|
||||||
parity_t parity,
|
parity_t parity,
|
||||||
stopbits_t stopbits,
|
stopbits_t stopbits,
|
||||||
flowcontrol_t flowcontrol);
|
flowcontrol_t flowcontrol,
|
||||||
|
dtrcontrol_t dtrcontrol);
|
||||||
|
|
||||||
virtual ~SerialImpl ();
|
virtual ~SerialImpl ();
|
||||||
|
|
||||||
@ -117,7 +118,7 @@ public:
|
|||||||
setRTS (bool level);
|
setRTS (bool level);
|
||||||
|
|
||||||
void
|
void
|
||||||
setDTR (bool level);
|
setDTR (dtrcontrol_t dtrcontrol);
|
||||||
|
|
||||||
bool
|
bool
|
||||||
waitForChange ();
|
waitForChange ();
|
||||||
@ -207,6 +208,7 @@ private:
|
|||||||
bytesize_t bytesize_; // Size of the bytes
|
bytesize_t bytesize_; // Size of the bytes
|
||||||
stopbits_t stopbits_; // Stop Bits
|
stopbits_t stopbits_; // Stop Bits
|
||||||
flowcontrol_t flowcontrol_; // Flow Control
|
flowcontrol_t flowcontrol_; // Flow Control
|
||||||
|
dtrcontrol_t dtrcontrol_; // Data Terminal Ready Control
|
||||||
|
|
||||||
// Mutex used to lock the read functions
|
// Mutex used to lock the read functions
|
||||||
pthread_mutex_t read_mutex;
|
pthread_mutex_t read_mutex;
|
||||||
|
|||||||
@ -59,7 +59,8 @@ public:
|
|||||||
bytesize_t bytesize,
|
bytesize_t bytesize,
|
||||||
parity_t parity,
|
parity_t parity,
|
||||||
stopbits_t stopbits,
|
stopbits_t stopbits,
|
||||||
flowcontrol_t flowcontrol);
|
flowcontrol_t flowcontrol,
|
||||||
|
dtrcontrol_t dtrcontrol);
|
||||||
|
|
||||||
virtual ~SerialImpl ();
|
virtual ~SerialImpl ();
|
||||||
|
|
||||||
@ -106,7 +107,7 @@ public:
|
|||||||
setRTS (bool level);
|
setRTS (bool level);
|
||||||
|
|
||||||
void
|
void
|
||||||
setDTR (bool level);
|
setDTR (dtrcontrol_t dtrcontrol);
|
||||||
|
|
||||||
bool
|
bool
|
||||||
waitForChange ();
|
waitForChange ();
|
||||||
@ -193,6 +194,7 @@ private:
|
|||||||
bytesize_t bytesize_; // Size of the bytes
|
bytesize_t bytesize_; // Size of the bytes
|
||||||
stopbits_t stopbits_; // Stop Bits
|
stopbits_t stopbits_; // Stop Bits
|
||||||
flowcontrol_t flowcontrol_; // Flow Control
|
flowcontrol_t flowcontrol_; // Flow Control
|
||||||
|
dtrcontrol_t dtrcontrol_; // Data Terminal Ready Control
|
||||||
|
|
||||||
// Mutex used to lock the read functions
|
// Mutex used to lock the read functions
|
||||||
HANDLE read_mutex;
|
HANDLE read_mutex;
|
||||||
|
|||||||
@ -89,6 +89,12 @@ typedef enum {
|
|||||||
flowcontrol_hardware
|
flowcontrol_hardware
|
||||||
} flowcontrol_t;
|
} flowcontrol_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
dtr_disable = 0,
|
||||||
|
dtr_enable = 1,
|
||||||
|
dtr_handshake = 2
|
||||||
|
} dtrcontrol_t;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Structure for setting the timeout of the serial port, times are
|
* Structure for setting the timeout of the serial port, times are
|
||||||
* in milliseconds.
|
* in milliseconds.
|
||||||
@ -183,7 +189,8 @@ public:
|
|||||||
bytesize_t bytesize = eightbits,
|
bytesize_t bytesize = eightbits,
|
||||||
parity_t parity = parity_none,
|
parity_t parity = parity_none,
|
||||||
stopbits_t stopbits = stopbits_one,
|
stopbits_t stopbits = stopbits_one,
|
||||||
flowcontrol_t flowcontrol = flowcontrol_none);
|
flowcontrol_t flowcontrol = flowcontrol_none,
|
||||||
|
dtrcontrol_t dtr = dtr_disable);
|
||||||
|
|
||||||
/*! Destructor */
|
/*! Destructor */
|
||||||
virtual ~Serial ();
|
virtual ~Serial ();
|
||||||
@ -612,7 +619,7 @@ public:
|
|||||||
|
|
||||||
/*! Set the DTR handshaking line to the given level. Defaults to true. */
|
/*! Set the DTR handshaking line to the given level. Defaults to true. */
|
||||||
void
|
void
|
||||||
setDTR (bool level = true);
|
setDTR (dtrcontrol_t dtrcontrol = dtr_enable);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Blocks until CTS, DSR, RI, CD changes or something interrupts it.
|
* Blocks until CTS, DSR, RI, CD changes or something interrupts it.
|
||||||
|
|||||||
@ -108,10 +108,12 @@ timespec_from_ms (const uint32_t millis)
|
|||||||
Serial::SerialImpl::SerialImpl (const string &port, unsigned long baudrate,
|
Serial::SerialImpl::SerialImpl (const string &port, unsigned long baudrate,
|
||||||
bytesize_t bytesize,
|
bytesize_t bytesize,
|
||||||
parity_t parity, stopbits_t stopbits,
|
parity_t parity, stopbits_t stopbits,
|
||||||
flowcontrol_t flowcontrol)
|
flowcontrol_t flowcontrol,
|
||||||
|
dtrcontrol_t dtrcontrol)
|
||||||
: port_ (port), fd_ (-1), is_open_ (false), xonxoff_ (false), rtscts_ (false),
|
: port_ (port), fd_ (-1), is_open_ (false), xonxoff_ (false), rtscts_ (false),
|
||||||
baudrate_ (baudrate), parity_ (parity),
|
baudrate_ (baudrate), parity_ (parity),
|
||||||
bytesize_ (bytesize), stopbits_ (stopbits), flowcontrol_ (flowcontrol)
|
bytesize_ (bytesize), stopbits_ (stopbits),
|
||||||
|
flowcontrol_ (flowcontrol), dtrcontrol_ (dtrcontrol)
|
||||||
{
|
{
|
||||||
pthread_mutex_init(&this->read_mutex, NULL);
|
pthread_mutex_init(&this->read_mutex, NULL);
|
||||||
pthread_mutex_init(&this->write_mutex, NULL);
|
pthread_mutex_init(&this->write_mutex, NULL);
|
||||||
@ -376,6 +378,13 @@ Serial::SerialImpl::reconfigurePort ()
|
|||||||
xonxoff_ = false;
|
xonxoff_ = false;
|
||||||
rtscts_ = true;
|
rtscts_ = true;
|
||||||
}
|
}
|
||||||
|
// setup dtr control
|
||||||
|
int dtr_flag = TIOCM_DTR;
|
||||||
|
if (dtrcontrol_ == dtr_enable) {
|
||||||
|
ioctl(fd_, TIOCMBIS, &dtr_flag);
|
||||||
|
} else if (dtrcontrol_ == dtr_disable) {
|
||||||
|
ioctl(fd_, TIOCMBIC, &dtr_flag);
|
||||||
|
}
|
||||||
// xonxoff
|
// xonxoff
|
||||||
#ifdef IXANY
|
#ifdef IXANY
|
||||||
if (xonxoff_)
|
if (xonxoff_)
|
||||||
@ -893,7 +902,7 @@ Serial::SerialImpl::setRTS (bool level)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Serial::SerialImpl::setDTR (bool level)
|
Serial::SerialImpl::setDTR (dtrcontrol_t dtrcontrol)
|
||||||
{
|
{
|
||||||
if (is_open_ == false) {
|
if (is_open_ == false) {
|
||||||
throw PortNotOpenedException ("Serial::setDTR");
|
throw PortNotOpenedException ("Serial::setDTR");
|
||||||
@ -901,14 +910,14 @@ Serial::SerialImpl::setDTR (bool level)
|
|||||||
|
|
||||||
int command = TIOCM_DTR;
|
int command = TIOCM_DTR;
|
||||||
|
|
||||||
if (level) {
|
if (dtrcontrol == dtr_enable) {
|
||||||
if (-1 == ioctl (fd_, TIOCMBIS, &command))
|
if (-1 == ioctl (fd_, TIOCMBIS, &command))
|
||||||
{
|
{
|
||||||
stringstream ss;
|
stringstream ss;
|
||||||
ss << "setDTR failed on a call to ioctl(TIOCMBIS): " << errno << " " << strerror(errno);
|
ss << "setDTR failed on a call to ioctl(TIOCMBIS): " << errno << " " << strerror(errno);
|
||||||
throw(SerialException(ss.str().c_str()));
|
throw(SerialException(ss.str().c_str()));
|
||||||
}
|
}
|
||||||
} else {
|
} else if (dtrcontrol == dtr_disable) {
|
||||||
if (-1 == ioctl (fd_, TIOCMBIC, &command))
|
if (-1 == ioctl (fd_, TIOCMBIC, &command))
|
||||||
{
|
{
|
||||||
stringstream ss;
|
stringstream ss;
|
||||||
|
|||||||
@ -34,10 +34,12 @@ _prefix_port_if_needed(const wstring &input)
|
|||||||
Serial::SerialImpl::SerialImpl (const string &port, unsigned long baudrate,
|
Serial::SerialImpl::SerialImpl (const string &port, unsigned long baudrate,
|
||||||
bytesize_t bytesize,
|
bytesize_t bytesize,
|
||||||
parity_t parity, stopbits_t stopbits,
|
parity_t parity, stopbits_t stopbits,
|
||||||
flowcontrol_t flowcontrol)
|
flowcontrol_t flowcontrol,
|
||||||
|
dtrcontrol_t dtrcontrol)
|
||||||
: port_ (port.begin(), port.end()), fd_ (INVALID_HANDLE_VALUE), is_open_ (false),
|
: port_ (port.begin(), port.end()), fd_ (INVALID_HANDLE_VALUE), is_open_ (false),
|
||||||
baudrate_ (baudrate), parity_ (parity),
|
baudrate_ (baudrate), parity_ (parity),
|
||||||
bytesize_ (bytesize), stopbits_ (stopbits), flowcontrol_ (flowcontrol)
|
bytesize_ (bytesize), stopbits_ (stopbits),
|
||||||
|
flowcontrol_ (flowcontrol), dtrcontrol_ (dtrcontrol)
|
||||||
{
|
{
|
||||||
if (port_.empty () == false)
|
if (port_.empty () == false)
|
||||||
open ();
|
open ();
|
||||||
@ -256,6 +258,13 @@ Serial::SerialImpl::reconfigurePort ()
|
|||||||
dcbSerialParams.fInX = false;
|
dcbSerialParams.fInX = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// setup dtr control
|
||||||
|
if (dtrcontrol_ == dtr_enable) {
|
||||||
|
dcbSerialParams.fDtrControl = DTR_CONTROL_ENABLE;
|
||||||
|
} else if (dtrcontrol_ == dtr_disable) {
|
||||||
|
dcbSerialParams.fDtrControl = DTR_CONTROL_DISABLE;
|
||||||
|
}
|
||||||
|
|
||||||
// activate settings
|
// activate settings
|
||||||
if (!SetCommState(fd_, &dcbSerialParams)){
|
if (!SetCommState(fd_, &dcbSerialParams)){
|
||||||
CloseHandle(fd_);
|
CloseHandle(fd_);
|
||||||
@ -519,14 +528,15 @@ Serial::SerialImpl::setRTS (bool level)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Serial::SerialImpl::setDTR (bool level)
|
Serial::SerialImpl::setDTR (dtrcontrol_t dtrcontrol)
|
||||||
{
|
{
|
||||||
if (is_open_ == false) {
|
if (is_open_ == false) {
|
||||||
throw PortNotOpenedException ("Serial::setDTR");
|
throw PortNotOpenedException ("Serial::setDTR");
|
||||||
}
|
}
|
||||||
if (level) {
|
dtrcontrol_ = dtrcontrol;
|
||||||
|
if (dtrcontrol == dtr_enable) {
|
||||||
EscapeCommFunction (fd_, SETDTR);
|
EscapeCommFunction (fd_, SETDTR);
|
||||||
} else {
|
} else if (dtrcontrol == dtr_disable) {
|
||||||
EscapeCommFunction (fd_, CLRDTR);
|
EscapeCommFunction (fd_, CLRDTR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -65,9 +65,9 @@ private:
|
|||||||
|
|
||||||
Serial::Serial (const string &port, uint32_t baudrate, serial::Timeout timeout,
|
Serial::Serial (const string &port, uint32_t baudrate, serial::Timeout timeout,
|
||||||
bytesize_t bytesize, parity_t parity, stopbits_t stopbits,
|
bytesize_t bytesize, parity_t parity, stopbits_t stopbits,
|
||||||
flowcontrol_t flowcontrol)
|
flowcontrol_t flowcontrol, dtrcontrol_t dtrcontrol)
|
||||||
: pimpl_(new SerialImpl (port, baudrate, bytesize, parity,
|
: pimpl_(new SerialImpl (port, baudrate, bytesize, parity,
|
||||||
stopbits, flowcontrol))
|
stopbits, flowcontrol, dtrcontrol))
|
||||||
{
|
{
|
||||||
pimpl_->setTimeout(timeout);
|
pimpl_->setTimeout(timeout);
|
||||||
}
|
}
|
||||||
@ -401,9 +401,9 @@ void Serial::setRTS (bool level)
|
|||||||
pimpl_->setRTS (level);
|
pimpl_->setRTS (level);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Serial::setDTR (bool level)
|
void Serial::setDTR (dtrcontrol_t dtrcontrol)
|
||||||
{
|
{
|
||||||
pimpl_->setDTR (level);
|
pimpl_->setDTR (dtrcontrol);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Serial::waitForChange()
|
bool Serial::waitForChange()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user