From 506205b42f33e2b2e15ad06bf3390fb164e4521c Mon Sep 17 00:00:00 2001 From: FalsinSoft Date: Tue, 31 Jan 2023 20:37:03 +0100 Subject: [PATCH] Added dtr/rts management --- include/CSerialPort/SerialPortUnixBase.h | 7 +++-- include/CSerialPort/SerialPortWinBase.h | 3 +- src/SerialPortUnixBase.cpp | 35 +++++++++++++++++++++--- src/SerialPortWinBase.cpp | 10 +++++-- 4 files changed, 44 insertions(+), 11 deletions(-) diff --git a/include/CSerialPort/SerialPortUnixBase.h b/include/CSerialPort/SerialPortUnixBase.h index 676359a..1492581 100644 --- a/include/CSerialPort/SerialPortUnixBase.h +++ b/include/CSerialPort/SerialPortUnixBase.h @@ -270,14 +270,12 @@ class CSerialPortUnixBase : public CSerialPortBase /** * @brief Set the Dtr object 设置DTR - * @todo Not implemented 未实现 * * @param set [in] */ virtual void setDtr(bool set = true); /** * @brief Set the Rts object 设置RTS - * @todo Not implemented 未实现 * * @param set [in] */ @@ -315,7 +313,9 @@ class CSerialPortUnixBase : public CSerialPortBase itas109::Parity parity = itas109::ParityNone, itas109::DataBits dataBits = itas109::DataBits8, itas109::StopBits stopbits = itas109::StopOne, - itas109::FlowControl flowControl = itas109::FlowNone); + itas109::FlowControl flowControl = itas109::FlowNone, + bool setDtr = false, + bool setRts = false); /** * @brief thread monitor 多线程监视器 @@ -359,6 +359,7 @@ class CSerialPortUnixBase : public CSerialPortBase itas109::StopBits m_stopbits; itas109::FlowControl m_flowControl; unsigned int m_readBufferSize; + bool m_setDtr, m_setRts; int fd; /* File descriptor for the port */ diff --git a/include/CSerialPort/SerialPortWinBase.h b/include/CSerialPort/SerialPortWinBase.h index 4e703fc..a20d7b5 100644 --- a/include/CSerialPort/SerialPortWinBase.h +++ b/include/CSerialPort/SerialPortWinBase.h @@ -272,14 +272,12 @@ class CSerialPortWinBase : public CSerialPortBase /** * @brief Set the Dtr object 设置DTR - * @todo Not implemented 未实现 * * @param set [in] */ virtual void setDtr(bool set = true); /** * @brief Set the Rts object 设置RTS - * @todo Not implemented 未实现 * * @param set [in] */ @@ -349,6 +347,7 @@ class CSerialPortWinBase : public CSerialPortBase itas109::StopBits m_stopbits; enum itas109::FlowControl m_flowControl; unsigned int m_readBufferSize; + bool m_setDtr, m_setRts; private: HANDLE m_handle; diff --git a/src/SerialPortUnixBase.cpp b/src/SerialPortUnixBase.cpp index f5dff76..5ecba24 100644 --- a/src/SerialPortUnixBase.cpp +++ b/src/SerialPortUnixBase.cpp @@ -62,6 +62,8 @@ CSerialPortUnixBase::CSerialPortUnixBase() , m_readBufferSize(4096) , m_isThreadRunning(false) , p_buffer(new itas109::RingBuffer(m_readBufferSize)) + , m_setDtr(false) + , m_setRts(false) { } @@ -76,6 +78,8 @@ CSerialPortUnixBase::CSerialPortUnixBase(const std::string &portName) , m_readBufferSize(4096) , m_isThreadRunning(false) , p_buffer(new itas109::RingBuffer(m_readBufferSize)) + , m_setDtr(false) + , m_setRts(false) { } @@ -112,7 +116,7 @@ void CSerialPortUnixBase::init(std::string portName, p_buffer = new itas109::RingBuffer(m_readBufferSize); } -int CSerialPortUnixBase::uartSet(int fd, int baudRate, itas109::Parity parity, itas109::DataBits dataBits, itas109::StopBits stopbits, itas109::FlowControl flowControl) +int CSerialPortUnixBase::uartSet(int fd, int baudRate, itas109::Parity parity, itas109::DataBits dataBits, itas109::StopBits stopbits, itas109::FlowControl flowControl, bool setDtr, bool setRts) { struct termios options; @@ -291,6 +295,23 @@ int CSerialPortUnixBase::uartSet(int fd, int baudRate, itas109::Parity parity, i return -1; } + int flags = 0; + if (setDtr) flags |= TIOCM_DTR; + if (setRts) flags |= TIOCM_RTS; + if (ioctl(fd, TIOCMBIS, &flags) < 0) + { + perror("set flags failed"); + return -1; + } + flags = 0; + if (!setDtr) flags |= TIOCM_DTR; + if (!setRts) flags |= TIOCM_RTS; + if (ioctl(fd, TIOCMBIC, &flags) < 0) + { + perror("clear flags failed"); + return -1; + } + return 0; } @@ -415,7 +436,7 @@ bool CSerialPortUnixBase::openPort() if (fcntl(fd, F_SETFL, 0) >= 0) // 阻塞,即使前面在open串口设备时设置的是非阻塞的,这里设为阻塞后,以此为准 { // set param - if (uartSet(fd, m_baudRate, m_parity, m_dataBits, m_stopbits, m_flowControl) == -1) + if (uartSet(fd, m_baudRate, m_parity, m_dataBits, m_stopbits, m_flowControl, m_setDtr, m_setRts) == -1) { fprintf(stderr, "uart set failed\n"); @@ -692,9 +713,15 @@ unsigned int CSerialPortUnixBase::getReadBufferSize() const return m_readBufferSize; } -void CSerialPortUnixBase::setDtr(bool set /*= true*/) {} +void CSerialPortUnixBase::setDtr(bool set) +{ + m_setDtr = set; +} -void CSerialPortUnixBase::setRts(bool set /*= true*/) {} +void CSerialPortUnixBase::setRts(bool set) +{ + m_setRts = set; +} bool CSerialPortUnixBase::isThreadRunning() { diff --git a/src/SerialPortWinBase.cpp b/src/SerialPortWinBase.cpp index b24d188..c00c968 100644 --- a/src/SerialPortWinBase.cpp +++ b/src/SerialPortWinBase.cpp @@ -52,6 +52,8 @@ CSerialPortWinBase::CSerialPortWinBase() , m_communicationMutex() , m_isThreadRunning(false) , p_buffer(new itas109::RingBuffer(m_readBufferSize)) + , m_setDtr(false) + , m_setRts(false) { overlapMonitor.Internal = 0; overlapMonitor.InternalHigh = 0; @@ -78,6 +80,8 @@ CSerialPortWinBase::CSerialPortWinBase(const std::string &portName) , m_communicationMutex() , m_isThreadRunning(false) , p_buffer(new itas109::RingBuffer(m_readBufferSize)) + , m_setDtr(false) + , m_setRts(false) { overlapMonitor.Internal = 0; overlapMonitor.InternalHigh = 0; @@ -170,8 +174,8 @@ bool CSerialPortWinBase::openPort() m_comConfigure.dcb.ByteSize = m_dataBits; m_comConfigure.dcb.Parity = m_parity; m_comConfigure.dcb.StopBits = m_stopbits; - // m_comConfigure.dcb.fDtrControl; - // m_comConfigure.dcb.fRtsControl; + m_comConfigure.dcb.fDtrControl = m_setDtr ? DTR_CONTROL_ENABLE : DTR_CONTROL_DISABLE; + m_comConfigure.dcb.fRtsControl = m_setRts ? RTS_CONTROL_ENABLE : RTS_CONTROL_DISABLE; m_comConfigure.dcb.fBinary = true; m_comConfigure.dcb.fInX = false; @@ -883,6 +887,7 @@ void CSerialPortWinBase::setDtr(bool set /*= true*/) EscapeCommFunction(m_handle, CLRDTR); } } + m_setDtr = set; } void CSerialPortWinBase::setRts(bool set /*= true*/) @@ -899,6 +904,7 @@ void CSerialPortWinBase::setRts(bool set /*= true*/) EscapeCommFunction(m_handle, CLRRTS); } } + m_setRts = set; } OVERLAPPED CSerialPortWinBase::getOverlapMonitor()