summaryrefslogtreecommitdiff
path: root/src/serialport/serialport.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/serialport/serialport.cpp')
-rw-r--r--src/serialport/serialport.cpp1086
1 files changed, 1086 insertions, 0 deletions
diff --git a/src/serialport/serialport.cpp b/src/serialport/serialport.cpp
new file mode 100644
index 0000000..178a835
--- /dev/null
+++ b/src/serialport/serialport.cpp
@@ -0,0 +1,1086 @@
+/****************************************************************************
+**
+** Copyright (C) 2011-2012 Denis Shienkov <scapig2@yandex.ru>
+** Copyright (C) 2011 Sergey Belyashov <Sergey.Belyashov@gmail.com>
+** Copyright (C) 2012 Laszlo Papp <lpapp@kde.org>
+** Copyright (C) 2012 Andre Hartmann <aha_1980@gmx.de>
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtSerialPort module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "serialport.h"
+#include "serialportinfo.h"
+
+#ifdef Q_OS_WIN
+#include "serialport_win_p.h"
+#elif defined (Q_OS_SYMBIAN)
+#include "serialport_symbian_p.h"
+#elif defined (Q_OS_UNIX)
+#include "serialport_unix_p.h"
+#else
+#error Unsupported OS
+#endif
+
+#ifndef SERIALPORT_BUFFERSIZE
+# define SERIALPORT_BUFFERSIZE 16384
+#endif
+
+QT_BEGIN_NAMESPACE_SERIALPORT
+
+SerialPortPrivateData::SerialPortPrivateData(SerialPort *q)
+ : readBufferMaxSize(0)
+ , readBuffer(SERIALPORT_BUFFERSIZE)
+ , writeBuffer(SERIALPORT_BUFFERSIZE)
+ , portError(SerialPort::NoError)
+ , inputRate(0)
+ , outputRate(0)
+ , dataBits(SerialPort::UnknownDataBits)
+ , parity(SerialPort::UnknownParity)
+ , stopBits(SerialPort::UnknownStopBits)
+ , flow(SerialPort::UnknownFlowControl)
+ , restoreSettingsOnClose(true)
+ , q_ptr(q)
+{
+}
+
+int SerialPortPrivateData::timeoutValue(int msecs, int elapsed)
+{
+ if (msecs == -1)
+ return msecs;
+ msecs -= elapsed;
+ return qMax(msecs, 0);
+}
+
+/*!
+ \class SerialPort
+
+ \brief The SerialPort class provides functions to access
+ serial ports.
+
+ \reentrant
+ \ingroup serialport-main
+ \inmodule QtAddOnSerialPort
+ \since 5.0
+
+ This class resembles the functionality and behavior of the QAbstractSocket
+ class in many aspects, for instance the I/O operations, the implementation
+ of the wait methods, the internal architecture and so forth. Certain
+ SerialPort method implementations were taken directly from QAbstractSocket
+ with only minor changes.
+
+ The features of the implementation and the conduct of the class are
+ listed below:
+
+ \list
+ \o Provides only common functionality which includes
+ configuring, I/O data stream, get and set control signals of the
+ RS-232 lines.
+ \o Does not support for terminal features as echo, control CR/LF and so
+ forth.
+ \o Always works in binary mode.
+ \o Does not support the native ability for configuring timeouts
+ and delays while reading.
+ \o Does not provide tracking and notification when the state
+ of RS-232 lines was changed.
+ \endlist
+
+ To get started with the SerialPort class, first create an object of
+ that.
+
+ Then, call the setPort() method in order to assign the object with the name
+ of the desired serial port (which has to be present in the system).
+ The name has to follow a certain format, which is platform dependent.
+
+ The helper class SerialPortInfo allows the enumeration of all the serial
+ ports in the system. This is useful to obtain the correct serial port name.
+
+ The SerialPortInfo class can also be used as an input parameter for the
+ setPort() method (to retrieve the currently assigned name, use the
+ portName() method).
+
+ After that, the serial port can be opened in read-only (r/o), write-only
+ (w/o) or read-write (r/w) mode using the open() method.
+
+ Note: The serial port is always opened with exclusive access
+ (i.e. no other process or thread can access an already opened serial port).
+
+ Having successfully opened, the SerialPort determines its current
+ configuration and initializes itself to that. To access the current
+ configuration use the rate(), dataBits(), parity(), stopBits(), and
+ flowControl() methods.
+
+ If these settings are satisfying, the I/O operation can be proceed with.
+ Otherwise the port can be reconfigured to the desired setting using the
+ setRate(), setDataBits(), setParity(), setStopBits(), and setFlowControl()
+ methods.
+
+ Read or write the data by calling read() or write(). Alternatively the
+ readLine() and readAll() convenience methods can also be invoked. The
+ SerialPort class also inherits the getChar(), putChar(), and ungetChar()
+ methods from the QIODevice class. Those methods work on single bytes. The
+ bytesWritten() signal is emitted when data has been written to the serial
+ port. Note that, Qt does not limit the write buffer size, which can be
+ monitored by listening to this signal.
+
+ The readyRead() signal is emitted every time a new chunk of data
+ has arrived. The bytesAvailable() method then returns the number of bytes
+ that are available for reading. Typically, the readyRead() signal would be
+ connected to a slot and all data available could be read in there.
+
+ If not all the data is read at once, the remaining data will
+ still be available later. Any new incoming data will be
+ appended to the SerialPort's internal read buffer. In order to limit the
+ size of the read buffer, call setReadBufferSize().
+
+ The status of the control lines is determined with the dtr(), rts(), and
+ lines() methods. To change the control line status, use the setDtr(), and
+ setRts() methods.
+
+ To close the serial port, call the close() method. After all the pending data
+ has been written to the serial port, the SerialPort class actually closes
+ the descriptor.
+
+ SerialPort provides a set of functions that suspend the calling
+ thread until certain signals are emitted. These functions can be
+ used to implement blocking serial ports:
+
+ \list
+ \o waitForReadyRead() blocks until new data is available for
+ reading.
+
+ \o waitForBytesWritten() blocks until one payload of data has been
+ written to the serial port.
+ \endlist
+
+ See the following example:
+
+ \code
+ int numRead = 0, numReadTotal = 0;
+ char buffer[50];
+
+ forever {
+ numRead = serial.read(buffer, 50);
+
+ // Do whatever with the array
+
+ numReadTotal += numRead;
+ if (numRead == 0 && !serial.waitForReadyRead())
+ break;
+ }
+ \endcode
+
+ If \l{QIODevice::}{waitForReadyRead()} returns false, the
+ connection has been closed or an error has occurred.
+
+ Programming with a blocking serial port is radically different from
+ programming with a non-blocking serial port. A blocking serial port
+ does not require an event loop and typically leads to simpler code.
+ However, in a GUI application, blocking serial port should only be
+ used in non-GUI threads, to avoid freezing the user interface.
+
+ See the \l examples/terminal and \l examples/blockingterminal
+ examples for an overview of both approaches.
+
+ The use of blocking functions is discouraged together with signals. One of
+ the two possibilities should be used.
+
+ The SerialPort class can be used with QTextStream and QDataStream's stream
+ operators (operator<<() and operator>>()). There is one issue to be aware
+ of, though: make sure that enough data is available before attempting to
+ read by using the operator>>() overloaded operator.
+
+ \sa SerialPortInfo
+*/
+
+/*!
+ \enum SerialPort::Direction
+
+ This enum describes the possible directions of the data transmission.
+ Note: This enumeration is used for setting the baud rate of the device
+ separately for each direction in case some operating systems (i.e. POSIX-like).
+
+ \value Input Input direction.
+ \value Output Output direction.
+ \value AllDirections Simultaneously in two directions.
+*/
+
+/*!
+ \enum SerialPort::Rate
+
+ This enum describes the baud rate which the communication device operates
+ with. Note: only the most common standard rates are listed in this enum.
+
+ \value Rate1200 1200 baud.
+ \value Rate2400 2400 baud.
+ \value Rate4800 4800 baud.
+ \value Rate9600 9600 baud.
+ \value Rate19200 19200 baud.
+ \value Rate38400 38400 baud.
+ \value Rate57600 57600 baud.
+ \value Rate115200 115200 baud.
+ \value UnknownRate Unknown baud.
+
+ \sa setRate(), rate()
+*/
+
+/*!
+ \enum SerialPort::DataBits
+
+ This enum describes the number of data bits used.
+
+ \value Data5 Five bits.
+ \value Data6 Six bits.
+ \value Data7 Seven bits
+ \value Data8 Eight bits.
+ \value UnknownDataBits Unknown number of bits.
+
+ \sa setDataBits(), dataBits()
+*/
+
+/*!
+ \enum SerialPort::Parity
+
+ This enum describes the parity scheme used.
+
+ \Value NoParity No parity.
+ \value EvenParity Even parity.
+ \value OddParity Odd parity.
+ \value SpaceParity Space parity.
+ \value MarkParity Mark parity.
+ \value UnknownParity Unknown parity.
+
+ \sa setParity(), parity()
+*/
+
+/*!
+ \enum SerialPort::StopBits
+
+ This enum describes the number of stop bits used.
+
+ \value OneStop 1 stop bit.
+ \value OneAndHalfStop 1.5 stop bits.
+ \value TwoStop 2 stop bits.
+ \value UnknownStopBits Unknown number of stop bit.
+
+ \sa setStopBits(), stopBits()
+*/
+
+/*!
+ \enum SerialPort::FlowControl
+
+ This enum describes the flow control used.
+
+ \value NoFlowControl No flow control.
+ \value HardwareControl Hardware flow control (RTS/CTS).
+ \value SoftwareControl Software flow control (XON/XOFF).
+ \value UnknownFlowControl Unknown flow control.
+
+ \sa setFlowControl(), flowControl()
+*/
+
+/*!
+ \enum SerialPort::Line
+
+ This enum describes the possible RS-232 pinout signals.
+
+ \value Le DSR (data set ready/line enable).
+ \value Dtr DTR (data terminal ready).
+ \value Rts RTS (request to send).
+ \value St Secondary TXD (transmit).
+ \value Sr Secondary RXD (receive).
+ \value Cts CTS (clear to send).
+ \value Dcd DCD (data carrier detect).
+ \value Ri RNG (ring).
+ \value Dsr DSR (data set ready).
+
+ \sa lines(), setDtr(), setRts(), dtr(), rts()
+*/
+
+/*!
+ \enum SerialPort::DataErrorPolicy
+
+ This enum describes the policies for the received symbols
+ while parity errors were detected.
+
+ \value SkipPolicy Skips the bad character.
+ \value PassZeroPolicy Replaces bad character to zero.
+ \value IgnorePolicy Ignores the error for a bad character.
+ \value StopReceivingPolicy Stops data reception on error.
+ \value UnknownPolicy Unknown policy.
+
+ \sa setDataErrorPolicy(), dataErrorPolicy()
+*/
+
+/*!
+ \enum SerialPort::PortError
+
+ This enum describes the errors that may be returned by the error()
+ method.
+
+ \value NoError No error occurred.
+ \value NoSuchDeviceError An error occurred while attempting to
+ open an non-existing device.
+ \value PermissionDeniedError An error occurred while attempting to
+ open an already opened device by another process or a user not
+ having enough permission and credentials to open.
+ \value DeviceAlreadyOpenedError An error occurred while attempting to
+ open an already opened device in this object.
+ \value DeviceIsNotOpenedError An error occurred while attempting to
+ control a device still closed.
+ \value ParityError Parity error detected by the hardware while reading data.
+ \value FramingError Framing error detected by the hardware while reading data.
+ \value BreakConditionError Break condition detected by the hardware on
+ the input line.
+ \value IoError An I/O error occurred while reading or writing the data.
+ \value UnsupportedPortOperationError The requested device operation is
+ not supported or prohibited by the running operating system.
+ \value UnknownPortError An unidentified error occurred.
+
+ \sa error(), unsetError()
+*/
+
+
+
+/*!
+ Constructs a new serial port object with the given \a parent.
+*/
+SerialPort::SerialPort(QObject *parent)
+ : QIODevice(parent)
+ , d_ptr(new SerialPortPrivate(this))
+{}
+
+/*!
+ Constructs a new serial port object with the given \a parent
+ to represent the serial port with the specified \a name.
+
+ The name should have a specific format; see the setPort() method.
+*/
+SerialPort::SerialPort(const QString &name, QObject *parent)
+ : QIODevice(parent)
+ , d_ptr(new SerialPortPrivate(this))
+{
+ setPort(name);
+}
+
+/*!
+ Constructs a new serial port object with the given \a parent
+ to represent the serial port with the specified a helper
+ class \a info.
+*/
+SerialPort::SerialPort(const SerialPortInfo &info, QObject *parent)
+ : QIODevice(parent)
+ , d_ptr(new SerialPortPrivate(this))
+{
+ setPort(info);
+}
+
+/*!
+ Closes the serial port, if neccessary, and then destroys object.
+*/
+SerialPort::~SerialPort()
+{
+ /**/
+ close();
+ delete d_ptr;
+}
+
+/*!
+ Sets the \a name of the port. The name may be in any format;
+ either short, or also as system location (with all the prefixes and
+ postfixed). As a result, this name will be automatically written
+ and converted into an internal variable as system location.
+
+ \sa portName(), SerialPortInfo
+*/
+void SerialPort::setPort(const QString &name)
+{
+ Q_D(SerialPort);
+ d->systemLocation = SerialPortPrivate::portNameToSystemLocation(name);
+}
+
+/*!
+ Sets the port stored in the serial port info instance \a info.
+
+ \sa portName(), SerialPortInfo
+*/
+void SerialPort::setPort(const SerialPortInfo &info)
+{
+ Q_D(SerialPort);
+ d->systemLocation = SerialPortPrivate::portNameToSystemLocation(info.systemLocation());
+}
+
+/*!
+ Returns the name set by setPort() or to the SerialPort constructors.
+ This name is short, i.e. it extract and convert out from the internal
+ variable system location of the device. Conversion algorithm is
+ platform specific:
+ \table
+ \header
+ \o Platform
+ \o Brief Description
+ \row
+ \o Windows
+ \o Removes the prefix "\\\\.\\" from the system location
+ and returns the remainder of the string.
+ \row
+ \o Windows CE
+ \o Removes the postfix ":" from the system location
+ and returns the remainder of the string.
+ \row
+ \o Symbian
+ \o Returns the system location as it is,
+ as it is equivalent to the port name.
+ \row
+ \o GNU/Linux
+ \o Removes the prefix "/dev/" from the system location
+ and returns the remainder of the string.
+ \row
+ \o Mac OSX
+ \o Removes the prefix "/dev/cu." and "/dev/tty." from the
+ system location and returns the remainder of the string.
+ \row
+ \o Other *nix
+ \o The same as for GNU/Linux.
+ \endtable
+
+ \sa setPort(), SerialPortInfo::portName()
+*/
+QString SerialPort::portName() const
+{
+ Q_D(const SerialPort);
+ return SerialPortPrivate::portNameFromSystemLocation(d->systemLocation);
+}
+
+/*! \reimp
+ Opens the serial port using OpenMode \a mode, and then returns true if
+ successful; otherwise returns false with and sets an error code which can be
+ obtained by calling the error() method.
+
+ \warning The \a mode has to be QIODevice::ReadOnly, QIODevice::WriteOnly,
+ or QIODevice::ReadWrite. This may also have additional flags, such as
+ QIODevice::Unbuffered. Other modes are unsupported.
+
+ \sa QIODevice::OpenMode, setPort()
+*/
+bool SerialPort::open(OpenMode mode)
+{
+ Q_D(SerialPort);
+
+ if (isOpen()) {
+ d->portError = SerialPort::DeviceAlreadyOpenedError;
+ return false;
+ }
+
+ // Define while not supported modes.
+ static const OpenMode unsupportedModes = Append | Truncate | Text | Unbuffered;
+ if ((mode & unsupportedModes) || mode == NotOpen) {
+ d->portError = SerialPort::UnsupportedPortOperationError;
+ return false;
+ }
+
+ unsetError();
+ if (d->open(mode)) {
+ QIODevice::open(mode);
+ return true;
+ }
+ return false;
+}
+
+/*! \reimp
+ Calls SerialPort::flush() and closes the serial port.
+ Errors from flush are ignored.
+
+ \sa QIODevice::close()
+*/
+void SerialPort::close()
+{
+ Q_D(SerialPort);
+ if (!isOpen()) {
+ d->portError = SerialPort::DeviceIsNotOpenedError;
+ return;
+ }
+
+ QIODevice::close();
+ d->close();
+}
+
+/*!
+ Sets or clears the flag \a restore, which allows to restore the
+ previous settings while closing the serial port. If this flag
+ is true, the settings will be restored; otherwise not.
+ The default state of the SerialPort class is configured to restore the
+ settings.
+
+ \sa restoreSettingsOnClose()
+*/
+void SerialPort::setRestoreSettingsOnClose(bool restore)
+{
+ Q_D( SerialPort);
+ d->restoreSettingsOnClose = restore;
+}
+
+/*!
+ Returns the current status of the restore flag settings on
+ closing the port. The default SerialPort is configured to
+ restore the settings.
+
+ \sa setRestoreSettingsOnClose()
+*/
+bool SerialPort::restoreSettingsOnClose() const
+{
+ Q_D(const SerialPort);
+ return d->restoreSettingsOnClose;
+}
+
+/*!
+ Sets the desired data rate \a rate for a given direction \a dir. If
+ successful, returns true; otherwise returns false and sets an error code
+ which can be obtained by calling error(). To set the baud rate, use the
+ enumeration SerialPort::Rate or any positive qint32 value.
+
+ \warning For OS Windows, Windows CE, Symbian supported only
+ AllDirections flag.
+
+ \sa rate()
+*/
+bool SerialPort::setRate(qint32 rate, Directions dir)
+{
+ Q_D(SerialPort);
+ if (d->setRate(rate, dir)) {
+ if (dir & SerialPort::Input)
+ d->inputRate = rate;
+ if (dir & SerialPort::Output)
+ d->outputRate = rate;
+ return true;
+ }
+ return false;
+}
+
+/*!
+ Returns the current baud rate of the chosen direction \a dir.
+
+ \warning Returns equal rate in any direction for Operating Systems as
+ Windows, Windows CE, and Symbian.
+
+ \sa setRate()
+*/
+qint32 SerialPort::rate(Directions dir) const
+{
+ Q_D(const SerialPort);
+ if (dir == SerialPort::AllDirections)
+ return d->inputRate == d->outputRate ?
+ d->inputRate : SerialPort::UnknownRate;
+ return dir & SerialPort::Input ? d->inputRate : d->outputRate;
+}
+
+/*!
+ Sets the desired number of data bits \a dataBits in a frame.
+ If successful, returns true; otherwise returns false and sets an error
+ code which can be obtained by calling the error() method.
+
+ \sa dataBits()
+*/
+bool SerialPort::setDataBits(DataBits dataBits)
+{
+ Q_D(SerialPort);
+ if (d->setDataBits(dataBits)) {
+ d->dataBits = dataBits;
+ return true;
+ }
+ return false;
+}
+
+/*!
+ Returns the current number of data bits in a frame.
+
+ \sa setDataBits()
+*/
+SerialPort::DataBits SerialPort::dataBits() const
+{
+ Q_D(const SerialPort);
+ return d->dataBits;
+}
+
+/*!
+ Sets the desired parity \a parity checking mode.
+ If successful, returns true; otherwise returns false and sets an error
+ code which can be obtained by calling the error() method.
+
+ \sa parity()
+*/
+bool SerialPort::setParity(Parity parity)
+{
+ Q_D(SerialPort);
+ if (d->setParity(parity)) {
+ d->parity = parity;
+ return true;
+ }
+ return false;
+}
+
+/*!
+ Returns the current parity checking mode.
+
+ \sa setParity()
+*/
+SerialPort::Parity SerialPort::parity() const
+{
+ Q_D(const SerialPort);
+ return d->parity;
+}
+
+/*!
+ Sets the desired number of stop bits \a stopBits in a frame. If successful,
+ returns true; otherwise returns false and sets an error code which can be
+ obtained by calling the error() method.
+
+ \sa stopBits()
+*/
+bool SerialPort::setStopBits(StopBits stopBits)
+{
+ Q_D(SerialPort);
+ if (d->setStopBits(stopBits)) {
+ d->stopBits = stopBits;
+ return true;
+ }
+ return false;
+}
+
+/*!
+ Returns the current number of stop bits.
+
+ \sa setStopBits()
+*/
+SerialPort::StopBits SerialPort::stopBits() const
+{
+ Q_D(const SerialPort);
+ return d->stopBits;
+}
+
+/*!
+ Sets the desired number flow control mode \a flow.
+ If successful, returns true; otherwise returns false and sets an error
+ code which can be obtained by calling the error() method.
+
+ \sa flowControl()
+*/
+bool SerialPort::setFlowControl(FlowControl flow)
+{
+ Q_D(SerialPort);
+ if (d->setFlowControl(flow)) {
+ d->flow = flow;
+ return true;
+ }
+ return false;
+}
+
+/*!
+ Returns the current flow control mode.
+
+ \sa setFlowControl()
+*/
+SerialPort::FlowControl SerialPort::flowControl() const
+{
+ Q_D(const SerialPort);
+ return d->flow;
+}
+
+/*!
+ Returns the current state of the line signal DTR.
+ If the signal state high, the return true; otherwise returns false;
+
+ \sa lines()
+*/
+bool SerialPort::dtr() const
+{
+ Q_D(const SerialPort);
+ return d->lines() & SerialPort::Dtr;
+}
+
+/*!
+ Returns the current state of the line signal RTS.
+ If the signal state high, the return true; otherwise returns false;
+
+ \sa lines()
+*/
+bool SerialPort::rts() const
+{
+ Q_D(const SerialPort);
+ return d->lines() & SerialPort::Rts;
+}
+
+/*!
+ Returns the bitmap states of the line signals.
+ From this result, it is possible to allocate the state of the
+ desired signal by applying a mask "AND", where the mask is
+ the desired enumeration value from SerialPort::Lines.
+
+ \sa dtr(), rts(), setDtr(), setRts()
+*/
+SerialPort::Lines SerialPort::lines() const
+{
+ Q_D(const SerialPort);
+ return d->lines();
+}
+
+/*!
+ This function writes as much as possible from the internal write
+ buffer to the underlying serial port without blocking. If any data
+ was written, this function returns true; otherwise returns false.
+
+ Call this function for sending the buffered data immediately to the serial
+ port. The number of bytes successfully written depends on the operating
+ system. In most cases, this function does not need to be called, because the
+ SerialPort class will start sending data automatically once control is
+ returned to the event loop. In the absence of an event loop, call
+ waitForBytesWritten() instead.
+
+ \sa write(), waitForBytesWritten()
+*/
+bool SerialPort::flush()
+{
+ Q_D(SerialPort);
+ return d->flush();
+}
+
+/*!
+ Discards all characters from the output or input buffer, depending on
+ a given direction \a dir. Including clear an internal class buffers and
+ the UART (driver) buffers. Also terminate pending read or write operations.
+ If successful, returns true; otherwise returns false.
+*/
+bool SerialPort::clear(Directions dir)
+{
+ Q_D(SerialPort);
+ if (dir & Input)
+ d->readBuffer.clear();
+ if (dir & Output)
+ d->writeBuffer.clear();
+ return d->clear(dir);
+}
+
+/*! \reimp
+
+ Returns true if no more data is currently available for reading; otherwise
+ returns false.
+
+ This function is most commonly used when reading data from the
+ serial port in a loop. For example:
+
+ \code
+ // This slot is connected to SerialPort::readyRead()
+ void SerialPortClass::readyReadSlot()
+ {
+ while (!port.atEnd()) {
+ QByteArray data = port.read(100);
+ ....
+ }
+ }
+ \endcode
+
+ \sa bytesAvailable(), readyRead()
+ */
+bool SerialPort::atEnd() const
+{
+ Q_D(const SerialPort);
+ return QIODevice::atEnd() && (!isOpen() || d->readBuffer.isEmpty());
+}
+
+/*!
+ Sets the error policy \a policy process received character in
+ the case of parity error detection. If successful, returns
+ true; otherwise returns false. The default policy set is IgnorePolicy.
+
+ \sa dataErrorPolicy()
+*/
+bool SerialPort::setDataErrorPolicy(DataErrorPolicy policy)
+{
+ Q_D(SerialPort);
+ const bool ret = d->policy == policy || d->setDataErrorPolicy(policy);
+ if (ret)
+ d->policy = policy;
+ return ret;
+}
+
+/*!
+ Returns current error policy.
+
+ \sa setDataErrorPolicy()
+*/
+SerialPort::DataErrorPolicy SerialPort::dataErrorPolicy() const
+{
+ Q_D(const SerialPort);
+ return d->policy;
+}
+
+/*!
+ Returns the serial port's error status.
+
+ The I/O device status returns an error code. For example, if open()
+ returns false, or a read/write operation returns -1, this function can
+ be called to find out the reason why the operation failed.
+
+ \sa unsetError()
+*/
+SerialPort::PortError SerialPort::error() const
+{
+ Q_D(const SerialPort);
+ return d->portError;
+}
+
+/*!
+ Clears the error code to SerialPort::NoError.
+
+ \sa error()
+*/
+void SerialPort::unsetError()
+{
+ Q_D(SerialPort);
+ d->portError = SerialPort::NoError;
+}
+
+/*!
+ Returns the size of the internal read buffer. This limits the
+ amount of data that the client can receive before calling the read()
+ or readAll() methods.
+
+ A read buffer size of 0 (the default) means that the buffer has
+ no size limit, ensuring that no data is lost.
+
+ \sa setReadBufferSize(), read()
+*/
+qint64 SerialPort::readBufferSize() const
+{
+ Q_D(const SerialPort);
+ return d->readBufferMaxSize;
+}
+
+/*!
+ Sets the size of SerialPort's internal read buffer to be \a
+ size bytes.
+
+ If the buffer size is limited to a certain size, SerialPort
+ will not buffer more than this size of data. Exceptionally, a buffer
+ size of 0 means that the read buffer is unlimited and all
+ incoming data is buffered. This is the default.
+
+ This option is useful if the data is only read at certain points
+ in time (for instance in a real-time streaming application) or if the serial
+ port should be protected against receiving too much data, which may
+ eventually causes that the application runs out of memory.
+
+ \sa readBufferSize(), read()
+*/
+void SerialPort::setReadBufferSize(qint64 size)
+{
+ Q_D(SerialPort);
+
+ if (d->readBufferMaxSize == size)
+ return;
+ d->readBufferMaxSize = size;
+}
+
+/*! \reimp
+ Always returns true. The serial port is a sequential device.
+*/
+bool SerialPort::isSequential() const
+{
+ return true;
+}
+
+/*! \reimp
+ Returns the number of incoming bytes that are waiting to be read.
+
+ \sa bytesToWrite(), read()
+*/
+qint64 SerialPort::bytesAvailable() const
+{
+ Q_D(const SerialPort);
+ return d->readBuffer.size() + QIODevice::bytesAvailable();
+}
+
+/*! \reimp
+ Returns the number of bytes that are waiting to be written. The
+ bytes are written when control goes back to the event loop or
+ when flush() is called.
+
+ \sa bytesAvailable(), flush()
+*/
+qint64 SerialPort::bytesToWrite() const
+{
+ Q_D(const SerialPort);
+ return d->writeBuffer.size() + QIODevice::bytesToWrite();
+}
+
+/*! \reimp
+ Returns true if a line of data can be read from the serial port;
+ otherwise returns false.
+
+ \sa readLine()
+*/
+bool SerialPort::canReadLine() const
+{
+ Q_D(const SerialPort);
+ const bool hasLine = d->readBuffer.canReadLine();
+ return hasLine || QIODevice::canReadLine();
+}
+
+/*! \reimp
+ This function blocks until new data is available for reading and the
+ \l{QIODevice::}{readyRead()} signal has been emitted. The function
+ will timeout after \a msecs milliseconds.
+
+ The function returns true if the readyRead() signal is emitted and
+ there is new data available for reading; otherwise it returns false
+ (if an error occurred or the operation timed out).
+
+ \sa waitForBytesWritten()
+*/
+bool SerialPort::waitForReadyRead(int msecs)
+{
+ Q_D(SerialPort);
+ return d->waitForReadyRead(msecs);
+}
+
+/*! \reimp
+*/
+bool SerialPort::waitForBytesWritten(int msecs)
+{
+ Q_D(SerialPort);
+ return d->waitForBytesWritten(msecs);
+}
+
+/*!
+ Sets the desired state of the line signal DTR,
+ depending on the flag \a set. If successful, returns true;
+ otherwise returns false.
+
+ If the flag is true then the DTR signal is set to high; otherwise low.
+
+ \sa lines(), dtr()
+*/
+bool SerialPort::setDtr(bool set)
+{
+ Q_D(SerialPort);
+ return d->setDtr(set);
+}
+
+/*!
+ Sets the desired state of the line signal RTS,
+ depending on the flag \a set. If successful, returns true;
+ otherwise returns false.
+
+ If the flag is true then the RTS signal is set to high; otherwise low.
+
+ \sa lines(), rts()
+*/
+bool SerialPort::setRts(bool set)
+{
+ Q_D(SerialPort);
+ return d->setRts(set);
+}
+
+/*!
+ Sends a continuous stream of zero bits during a specified period
+ of time \a duration in msec if the terminal is using asynchronous
+ serial data. If successful, returns true; otherwise returns false.
+
+ If the duration is zero then zero bits are transmitted by at least
+ 0.25 seconds, but no more than 0.5 seconds.
+
+ If the duration is non zero then zero bits are transmitted within a certain
+ period of time depending on the implementation.
+
+ \sa setBreak(), clearBreak()
+*/
+bool SerialPort::sendBreak(int duration)
+{
+ Q_D(SerialPort);
+ return d->sendBreak(duration);
+}
+
+/*!
+ Controls the signal break, depending on the flag \a set.
+ If successful, returns true; otherwise returns false.
+
+ If \a set is true then enables the break transmission; otherwise disables.
+
+ \sa clearBreak(), sendBreak()
+*/
+bool SerialPort::setBreak(bool set)
+{
+ Q_D(SerialPort);
+ return d->setBreak(set);
+}
+
+/*! \reimp
+*/
+qint64 SerialPort::readData(char *data, qint64 maxSize)
+{
+ Q_D(SerialPort);
+ return d->readFromBuffer(data, maxSize);
+}
+
+/*! \reimp
+*/
+qint64 SerialPort::readLineData(char *data, qint64 maxSize)
+{
+ return QIODevice::readLineData(data, maxSize);
+}
+
+/*! \reimp
+*/
+qint64 SerialPort::writeData(const char *data, qint64 maxSize)
+{
+ Q_D(SerialPort);
+ return d->writeToBuffer(data, maxSize);
+}
+
+/*!
+ \fn bool SerialPort::clearBreak(bool clear)
+
+ Controls the signal break, depending on the flag \a clear.
+ If successful, returns true; otherwise returns false.
+
+ If clear is false then enables the break transmission; otherwise disables.
+
+ \sa setBreak(), sendBreak()
+*/
+
+#include "moc_serialport.cpp"
+
+QT_END_NAMESPACE_SERIALPORT