You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1167 lines
33 KiB
1167 lines
33 KiB
/**************************************************************************** |
|
** |
|
** Copyright (C) 2011-2012 Denis Shienkov <denis.shienkov@gmail.com> |
|
** 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/legal |
|
** |
|
** This file is part of the QtSerialPort module of the Qt Toolkit. |
|
** |
|
** $QT_BEGIN_LICENSE:LGPL$ |
|
** Commercial License Usage |
|
** Licensees holding valid commercial Qt licenses may use this file in |
|
** accordance with the commercial license agreement provided with the |
|
** Software or, alternatively, in accordance with the terms contained in |
|
** a written agreement between you and Digia. For licensing terms and |
|
** conditions see http://qt.digia.com/licensing. For further information |
|
** use the contact form at http://qt.digia.com/contact-us. |
|
** |
|
** GNU Lesser General Public License Usage |
|
** Alternatively, 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, Digia gives you certain additional |
|
** rights. These rights are described in the Digia 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. |
|
** |
|
** |
|
** $QT_END_LICENSE$ |
|
** |
|
****************************************************************************/ |
|
|
|
#include "qserialport.h" |
|
#include "qserialportinfo.h" |
|
|
|
#ifdef Q_OS_WIN |
|
#include "qserialport_win_p.h" |
|
#elif defined (Q_OS_SYMBIAN) |
|
#include "qserialport_symbian_p.h" |
|
#elif defined (Q_OS_UNIX) |
|
#include "qserialport_unix_p.h" |
|
#else |
|
#error Unsupported OS |
|
#endif |
|
|
|
#ifndef SERIALPORT_BUFFERSIZE |
|
# define SERIALPORT_BUFFERSIZE 16384 |
|
#endif |
|
|
|
QT_BEGIN_NAMESPACE |
|
|
|
QSerialPortPrivateData::QSerialPortPrivateData(QSerialPort *q) |
|
: readBufferMaxSize(0) |
|
, readBuffer(SERIALPORT_BUFFERSIZE) |
|
, writeBuffer(SERIALPORT_BUFFERSIZE) |
|
, error(QSerialPort::NoError) |
|
, inputBaudRate(0) |
|
, outputBaudRate(0) |
|
, dataBits(QSerialPort::UnknownDataBits) |
|
, parity(QSerialPort::UnknownParity) |
|
, stopBits(QSerialPort::UnknownStopBits) |
|
, flow(QSerialPort::UnknownFlowControl) |
|
, policy(QSerialPort::IgnorePolicy) |
|
, settingsRestoredOnClose(true) |
|
, q_ptr(q) |
|
{ |
|
} |
|
|
|
int QSerialPortPrivateData::timeoutValue(int msecs, int elapsed) |
|
{ |
|
if (msecs == -1) |
|
return msecs; |
|
msecs -= elapsed; |
|
return qMax(msecs, 0); |
|
} |
|
|
|
/*! |
|
\class QSerialPort |
|
|
|
\brief Provides functions to access serial ports. |
|
|
|
\reentrant |
|
\ingroup serialport-main |
|
\inmodule QtSerialPort |
|
\since 5.1 |
|
|
|
You can get information about the available serial ports using the |
|
QSerialPortInfo helper class, which allows an enumeration of all the serial |
|
ports in the system. This is useful to obtain the correct name of the |
|
serial port you want to use. You can pass an object |
|
of the helper class as an argument to the setPort() or setPortName() |
|
methods to assign the desired serial device. |
|
|
|
After setting the port, you can open it 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 |
|
(that is, no other process or thread can access an already opened serial port). |
|
|
|
Having successfully opened, QSerialPort tries to determine the current |
|
configuration of the port and initializes itself. You can reconfigure the |
|
port to the desired setting using the setBaudRate(), setDataBits(), |
|
setParity(), setStopBits(), and setFlowControl() methods. |
|
|
|
The status of the control pinout signals is determined with the |
|
isDataTerminalReady(), isRequestToSend, and pinoutSignals() methods. To |
|
change the control line status, use the setDataTerminalReady(), and |
|
setRequestToSend() methods. |
|
|
|
Once you know that the ports are ready to read or write, you can |
|
use the read() or write() methods. Alternatively the |
|
readLine() and readAll() convenience methods can also be invoked. |
|
If not all the data is read at once, the remaining data will |
|
be available for later as new incoming data is appended to the |
|
QSerialPort's internal read buffer. You can limit the size of the read |
|
buffer using setReadBufferSize(). |
|
|
|
Use the close() method to close the port and cancel the I/O operations. |
|
|
|
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. |
|
|
|
For more details about these approaches, refer to the |
|
\l {Examples}{example} applications. |
|
|
|
The QSerialPort class can also 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 QSerialPortInfo |
|
*/ |
|
|
|
/*! |
|
\enum QSerialPort::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 on some operating systems (for example, |
|
POSIX-like). |
|
|
|
\value Input Input direction. |
|
\value Output Output direction. |
|
\value AllDirections Simultaneously in two directions. |
|
*/ |
|
|
|
/*! |
|
\enum QSerialPort::BaudRate |
|
|
|
This enum describes the baud rate which the communication device operates |
|
with. Note: only the most common standard baud rates are listed in this |
|
enum. |
|
|
|
\value Baud1200 1200 baud. |
|
\value Baud2400 2400 baud. |
|
\value Baud4800 4800 baud. |
|
\value Baud9600 9600 baud. |
|
\value Baud19200 19200 baud. |
|
\value Baud38400 38400 baud. |
|
\value Baud57600 57600 baud. |
|
\value Baud115200 115200 baud. |
|
\value UnknownBaud Unknown baud. |
|
|
|
\sa QSerialPort::baudRate |
|
*/ |
|
|
|
/*! |
|
\enum QSerialPort::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 QSerialPort::dataBits |
|
*/ |
|
|
|
/*! |
|
\enum QSerialPort::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 QSerialPort::parity |
|
*/ |
|
|
|
/*! |
|
\enum QSerialPort::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 QSerialPort::stopBits |
|
*/ |
|
|
|
/*! |
|
\enum QSerialPort::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 QSerialPort::flowControl |
|
*/ |
|
|
|
/*! |
|
\enum QSerialPort::PinoutSignal |
|
|
|
This enum describes the possible RS-232 pinout signals. |
|
|
|
\value NoSignal No line active |
|
\value TransmittedDataSignal TxD (Transmitted Data). |
|
\value ReceivedDataSignal RxD (Received Data). |
|
\value DataTerminalReadySignal DTR (Data Terminal Ready). |
|
\value DataCarrierDetectSignal DCD (Data Carrier Detect). |
|
\value DataSetReadySignal DSR (Data Set Ready). |
|
\value RingIndicatorSignal RNG (Ring Indicator). |
|
\value RequestToSendSignal RTS (Request To Send). |
|
\value ClearToSendSignal CTS (Clear To Send). |
|
\value SecondaryTransmittedDataSignal STD (Secondary Transmitted Data). |
|
\value SecondaryReceivedDataSignal SRD (Secondary Received Data). |
|
|
|
\sa pinoutSignals(), QSerialPort::dataTerminalReady, |
|
QSerialPort::requestToSend |
|
*/ |
|
|
|
/*! |
|
\enum QSerialPort::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 QSerialPort::dataErrorPolicy |
|
*/ |
|
|
|
/*! |
|
\enum QSerialPort::SerialPortError |
|
|
|
This enum describes the errors that may be contained by the |
|
QSerialPort::error property. |
|
|
|
\value NoError No error occurred. |
|
\value DeviceNotFoundError An error occurred while attempting to |
|
open an non-existing device. |
|
\value PermissionError 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 OpenError An error occurred while attempting to |
|
open an already opened device in this object. |
|
\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 WriteError An I/O error occurred while writing the data. |
|
\value ReadError An I/O error occurred while reading the data. |
|
\value ResourceError An I/O error occurred when a resource becomes unavailable, |
|
e.g. when the device is unexpectedly removed from the system. |
|
\value UnsupportedOperationError The requested device operation is |
|
not supported or prohibited by the running operating system. |
|
\value UnknownError An unidentified error occurred. |
|
|
|
\sa QSerialPort::error |
|
*/ |
|
|
|
|
|
|
|
/*! |
|
Constructs a new serial port object with the given \a parent. |
|
*/ |
|
QSerialPort::QSerialPort(QObject *parent) |
|
: QIODevice(parent) |
|
, d_ptr(new QSerialPortPrivate(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. |
|
*/ |
|
QSerialPort::QSerialPort(const QString &name, QObject *parent) |
|
: QIODevice(parent) |
|
, d_ptr(new QSerialPortPrivate(this)) |
|
{ |
|
setPortName(name); |
|
} |
|
|
|
/*! |
|
Constructs a new serial port object with the given \a parent |
|
to represent the serial port with the specified helper class |
|
\a serialPortInfo. |
|
*/ |
|
QSerialPort::QSerialPort(const QSerialPortInfo &serialPortInfo, QObject *parent) |
|
: QIODevice(parent) |
|
, d_ptr(new QSerialPortPrivate(this)) |
|
{ |
|
setPort(serialPortInfo); |
|
} |
|
|
|
/*! |
|
Closes the serial port, if necessary, and then destroys object. |
|
*/ |
|
QSerialPort::~QSerialPort() |
|
{ |
|
/**/ |
|
close(); |
|
delete d_ptr; |
|
} |
|
|
|
/*! |
|
Sets the \a name of the serial port. |
|
|
|
The name of the serial port can be passed on as either a short name or |
|
the long system location if necessary. |
|
|
|
\sa portName(), QSerialPortInfo |
|
*/ |
|
void QSerialPort::setPortName(const QString &name) |
|
{ |
|
Q_D(QSerialPort); |
|
d->systemLocation = QSerialPortPrivate::portNameToSystemLocation(name); |
|
} |
|
|
|
/*! |
|
Sets the port stored in the serial port info instance \a serialPortInfo. |
|
|
|
\sa portName(), QSerialPortInfo |
|
*/ |
|
void QSerialPort::setPort(const QSerialPortInfo &serialPortInfo) |
|
{ |
|
Q_D(QSerialPort); |
|
d->systemLocation = QSerialPortPrivate::portNameToSystemLocation(serialPortInfo.systemLocation()); |
|
} |
|
|
|
/*! |
|
Returns the name set by setPort() or to the QSerialPort 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 |
|
\li Platform |
|
\li Brief Description |
|
\row |
|
\li Windows |
|
\li Removes the prefix "\\\\.\\" from the system location |
|
and returns the remainder of the string. |
|
\row |
|
\li Windows CE |
|
\li Removes the postfix ":" from the system location |
|
and returns the remainder of the string. |
|
\row |
|
\li Symbian |
|
\li Returns the system location as it is, |
|
as it is equivalent to the port name. |
|
\row |
|
\li GNU/Linux |
|
\li Removes the prefix "/dev/" from the system location |
|
and returns the remainder of the string. |
|
\row |
|
\li Mac OSX |
|
\li Removes the prefix "/dev/cu." and "/dev/tty." from the |
|
system location and returns the remainder of the string. |
|
\row |
|
\li Other *nix |
|
\li The same as for GNU/Linux. |
|
\endtable |
|
|
|
\sa setPort(), QSerialPortInfo::portName() |
|
*/ |
|
QString QSerialPort::portName() const |
|
{ |
|
Q_D(const QSerialPort); |
|
return QSerialPortPrivate::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. Other modes are unsupported. |
|
|
|
\sa QIODevice::OpenMode, setPort() |
|
*/ |
|
bool QSerialPort::open(OpenMode mode) |
|
{ |
|
Q_D(QSerialPort); |
|
|
|
if (isOpen()) { |
|
setError(QSerialPort::OpenError); |
|
return false; |
|
} |
|
|
|
// Define while not supported modes. |
|
static const OpenMode unsupportedModes = Append | Truncate | Text | Unbuffered; |
|
if ((mode & unsupportedModes) || mode == NotOpen) { |
|
setError(QSerialPort::UnsupportedOperationError); |
|
return false; |
|
} |
|
|
|
clearError(); |
|
if (d->open(mode)) { |
|
QIODevice::open(mode); |
|
|
|
d->dataTerminalReady = isDataTerminalReady(); |
|
d->requestToSend = isRequestToSend(); |
|
|
|
return true; |
|
} |
|
return false; |
|
} |
|
|
|
/*! |
|
\reimp |
|
|
|
\sa QIODevice::close() |
|
*/ |
|
void QSerialPort::close() |
|
{ |
|
Q_D(QSerialPort); |
|
if (!isOpen()) { |
|
return; |
|
} |
|
|
|
QIODevice::close(); |
|
d->close(); |
|
} |
|
|
|
/*! |
|
\property QSerialPort::settingsRestoredOnClose |
|
\brief the flag 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 QSerialPort class is configured to restore the |
|
settings. |
|
*/ |
|
void QSerialPort::setSettingsRestoredOnClose(bool restore) |
|
{ |
|
Q_D(QSerialPort); |
|
|
|
if (d->settingsRestoredOnClose != restore) { |
|
d->settingsRestoredOnClose = restore; |
|
emit settingsRestoredOnCloseChanged(d->settingsRestoredOnClose); |
|
} |
|
} |
|
|
|
bool QSerialPort::settingsRestoredOnClose() const |
|
{ |
|
Q_D(const QSerialPort); |
|
return d->settingsRestoredOnClose; |
|
} |
|
|
|
/*! |
|
\fn void QSerialPort::settingsRestoredOnCloseChanged(bool restore) |
|
|
|
This signal is emitted after the flag which allows to restore the |
|
previous settings while closing the serial port has been changed. The new |
|
flag which allows to restore the previous settings while closing the serial |
|
port is passed as \a restore. |
|
|
|
\sa QSerialPort::settingsRestoredOnClose |
|
*/ |
|
|
|
/*! |
|
\property QSerialPort::baudRate |
|
\brief the data baud rate for the desired direction |
|
|
|
If the setting is successful, returns true; otherwise returns false and sets |
|
an error code which can be obtained by accessing the value of the |
|
QSerialPort::error property. To set the baud rate, use the enumeration |
|
QSerialPort::BaudRate or any positive qint32 value. |
|
|
|
\warning Only the AllDirections flag is support for setting this property on |
|
Windows, Windows CE, and Symbian. |
|
|
|
\warning Returns equal baud rate in any direction on Windows, Windows CE, and |
|
Symbian. |
|
*/ |
|
bool QSerialPort::setBaudRate(qint32 baudRate, Directions dir) |
|
{ |
|
Q_D(QSerialPort); |
|
|
|
if (d->setBaudRate(baudRate, dir)) { |
|
if (dir & QSerialPort::Input) { |
|
if (d->inputBaudRate != baudRate) |
|
d->inputBaudRate = baudRate; |
|
else |
|
dir &= ~QSerialPort::Input; |
|
} |
|
|
|
if (dir & QSerialPort::Output) { |
|
if (d->outputBaudRate != baudRate) |
|
d->outputBaudRate = baudRate; |
|
else |
|
dir &= ~QSerialPort::Output; |
|
} |
|
|
|
if (dir) |
|
emit baudRateChanged(baudRate, dir); |
|
|
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
qint32 QSerialPort::baudRate(Directions dir) const |
|
{ |
|
Q_D(const QSerialPort); |
|
if (dir == QSerialPort::AllDirections) |
|
return d->inputBaudRate == d->outputBaudRate ? |
|
d->inputBaudRate : QSerialPort::UnknownBaud; |
|
return dir & QSerialPort::Input ? d->inputBaudRate : d->outputBaudRate; |
|
} |
|
|
|
/*! |
|
\fn void QSerialPort::baudRateChanged(qint32 baudRate, Directions dir) |
|
|
|
This signal is emitted after the baud rate has been changed. The new baud |
|
rate is passed as \a baudRate and directions as \a dir. |
|
|
|
\sa QSerialPort::baudRate |
|
*/ |
|
|
|
/*! |
|
\property QSerialPort::dataBits |
|
\brief the data bits in a frame |
|
|
|
If the setting is successful, returns true; otherwise returns false and sets |
|
an error code which can be obtained by accessing the value of the |
|
QSerialPort::error property. |
|
*/ |
|
bool QSerialPort::setDataBits(DataBits dataBits) |
|
{ |
|
Q_D(QSerialPort); |
|
|
|
if (d->setDataBits(dataBits)) { |
|
if (d->dataBits != dataBits) { |
|
d->dataBits = dataBits; |
|
emit dataBitsChanged(d->dataBits); |
|
} |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
QSerialPort::DataBits QSerialPort::dataBits() const |
|
{ |
|
Q_D(const QSerialPort); |
|
return d->dataBits; |
|
} |
|
|
|
/*! |
|
\fn void QSerialPort::dataBitsChanged(DataBits dataBits) |
|
|
|
This signal is emitted after the data bits in a frame has been changed. The |
|
new data bits in a frame is passed as \a dataBits. |
|
|
|
\sa QSerialPort::dataBits |
|
*/ |
|
|
|
|
|
/*! |
|
\property QSerialPort::parity |
|
\brief the parity checking mode |
|
|
|
If the setting is successful, returns true; otherwise returns false and sets |
|
an error code which can be obtained by accessing the value of the |
|
QSerialPort::error property. |
|
*/ |
|
bool QSerialPort::setParity(Parity parity) |
|
{ |
|
Q_D(QSerialPort); |
|
|
|
if (d->setParity(parity)) { |
|
if (d->parity != parity) { |
|
d->parity = parity; |
|
emit parityChanged(d->parity); |
|
} |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
QSerialPort::Parity QSerialPort::parity() const |
|
{ |
|
Q_D(const QSerialPort); |
|
return d->parity; |
|
} |
|
|
|
/*! |
|
\fn void QSerialPort::parityChanged(Parity parity) |
|
|
|
This signal is emitted after the parity checking mode has been changed. The |
|
new parity checking mode is passed as \a parity. |
|
|
|
\sa QSerialPort::parity |
|
*/ |
|
|
|
/*! |
|
\property QSerialPort::stopBits |
|
\brief the number of stop bits in a frame |
|
|
|
If the setting is successful, returns true; otherwise returns false and |
|
sets an error code which can be obtained by accessing the value of the |
|
QSerialPort::error property. |
|
*/ |
|
bool QSerialPort::setStopBits(StopBits stopBits) |
|
{ |
|
Q_D(QSerialPort); |
|
|
|
if (d->setStopBits(stopBits)) { |
|
if (d->stopBits != stopBits) { |
|
d->stopBits = stopBits; |
|
emit stopBitsChanged(d->stopBits); |
|
} |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
QSerialPort::StopBits QSerialPort::stopBits() const |
|
{ |
|
Q_D(const QSerialPort); |
|
return d->stopBits; |
|
} |
|
|
|
/*! |
|
\fn void QSerialPort::stopBitsChanged(StopBits stopBits) |
|
|
|
This signal is emitted after the number of stop bits in a frame has been |
|
changed. The new number of stop bits in a frame is passed as \a stopBits. |
|
|
|
\sa QSerialPort::stopBits |
|
*/ |
|
|
|
/*! |
|
\property QSerialPort::flowControl |
|
\brief the desired flow control mode |
|
|
|
If the setting is successful, returns true; otherwise returns false and sets |
|
an error code which can be obtained by accessing the value of the |
|
QSerialPort::error property. |
|
*/ |
|
bool QSerialPort::setFlowControl(FlowControl flow) |
|
{ |
|
Q_D(QSerialPort); |
|
|
|
if (d->setFlowControl(flow)) { |
|
if (d->flow != flow) { |
|
d->flow = flow; |
|
emit flowControlChanged(d->flow); |
|
} |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
QSerialPort::FlowControl QSerialPort::flowControl() const |
|
{ |
|
Q_D(const QSerialPort); |
|
return d->flow; |
|
} |
|
|
|
/*! |
|
\fn void QSerialPort::flowControlChanged(FlowControl flow) |
|
|
|
This signal is emitted after the flow control mode has been changed. The |
|
new flow control mode is passed as \a flow. |
|
|
|
\sa QSerialPort::flowControl |
|
*/ |
|
|
|
/*! |
|
\property QSerialPort::dataTerminalReady |
|
\brief the state (high or low) of the line signal DTR |
|
|
|
If the setting is successful, returns true; otherwise returns false. |
|
If the flag is true then the DTR signal is set to high; otherwise low. |
|
|
|
\sa pinoutSignals() |
|
*/ |
|
bool QSerialPort::setDataTerminalReady(bool set) |
|
{ |
|
Q_D(QSerialPort); |
|
|
|
bool retval = d->setDataTerminalReady(set); |
|
if (retval && (d->dataTerminalReady != set)) { |
|
d->dataTerminalReady = set; |
|
emit dataTerminalReadyChanged(set); |
|
} |
|
|
|
return retval; |
|
} |
|
|
|
bool QSerialPort::isDataTerminalReady() |
|
{ |
|
Q_D(const QSerialPort); |
|
return d->pinoutSignals() & QSerialPort::DataTerminalReadySignal; |
|
} |
|
|
|
/*! |
|
\fn void QSerialPort::dataTerminalReadyChanged(bool set) |
|
|
|
This signal is emitted after the state (high or low) of the line signal DTR |
|
has been changed. The new the state (high or low) of the line signal DTR is |
|
passed as \a set. |
|
|
|
\sa QSerialPort::dataTerminalReady |
|
*/ |
|
|
|
/*! |
|
\property QSerialPort::requestToSend |
|
\brief the state (high or low) of the line signal RTS |
|
|
|
If the setting is successful, returns true; otherwise returns false. |
|
If the flag is true then the RTS signal is set to high; otherwise low. |
|
|
|
\sa pinoutSignals() |
|
*/ |
|
bool QSerialPort::setRequestToSend(bool set) |
|
{ |
|
Q_D(QSerialPort); |
|
|
|
bool retval = d->setRequestToSend(set); |
|
if (retval && (d->requestToSend != set)) { |
|
d->requestToSend = set; |
|
emit requestToSendChanged(set); |
|
} |
|
|
|
return retval; |
|
} |
|
|
|
bool QSerialPort::isRequestToSend() |
|
{ |
|
Q_D(const QSerialPort); |
|
return d->pinoutSignals() & QSerialPort::RequestToSendSignal; |
|
} |
|
|
|
/*! |
|
\fn void QSerialPort::requestToSendChanged(bool set) |
|
|
|
This signal is emitted after the state (high or low) of the line signal RTS |
|
has been changed. The new the state (high or low) of the line signal RTS is |
|
passed as \a set. |
|
|
|
\sa QSerialPort::requestToSend |
|
*/ |
|
|
|
/*! |
|
Returns the state of the line signals in a bitmap format. |
|
|
|
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 QSerialPort::PinoutSignals. |
|
|
|
Note that, this method performs a system call, thus ensuring that the line |
|
signal states are returned properly. This is necessary when the underlying |
|
operating systems cannot provide proper notifications about the changes. |
|
|
|
\sa isDataTerminalReady(), isRequestToSend, setDataTerminalReady(), |
|
setRequestToSend() |
|
*/ |
|
QSerialPort::PinoutSignals QSerialPort::pinoutSignals() |
|
{ |
|
Q_D(const QSerialPort); |
|
return d->pinoutSignals(); |
|
} |
|
|
|
/*! |
|
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 |
|
QSerialPort 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 QSerialPort::flush() |
|
{ |
|
Q_D(QSerialPort); |
|
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 QSerialPort::clear(Directions dir) |
|
{ |
|
Q_D(QSerialPort); |
|
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 QSerialPort::readyRead() |
|
void QSerialPortClass::readyReadSlot() |
|
{ |
|
while (!port.atEnd()) { |
|
QByteArray data = port.read(100); |
|
.... |
|
} |
|
} |
|
\endcode |
|
|
|
\sa bytesAvailable(), readyRead() |
|
*/ |
|
bool QSerialPort::atEnd() const |
|
{ |
|
Q_D(const QSerialPort); |
|
return QIODevice::atEnd() && (!isOpen() || (d->bytesAvailable() == 0)); |
|
} |
|
|
|
/*! |
|
\property QSerialPort::dataErrorPolicy |
|
\brief the error policy how the process receives the character in case of |
|
parity error detection. |
|
|
|
If the setting is successful, returns true; otherwise returns false. The |
|
default policy set is IgnorePolicy. |
|
*/ |
|
bool QSerialPort::setDataErrorPolicy(DataErrorPolicy policy) |
|
{ |
|
Q_D(QSerialPort); |
|
|
|
const bool ret = d->policy == policy || d->setDataErrorPolicy(policy); |
|
if (ret && (d->policy != policy)) { |
|
d->policy = policy; |
|
emit dataErrorPolicyChanged(d->policy); |
|
} |
|
|
|
return ret; |
|
} |
|
|
|
QSerialPort::DataErrorPolicy QSerialPort::dataErrorPolicy() const |
|
{ |
|
Q_D(const QSerialPort); |
|
return d->policy; |
|
} |
|
|
|
/*! |
|
\fn void QSerialPort::dataErrorPolicyChanged(DataErrorPolicy policy) |
|
|
|
This signal is emitted after the error policy how the process receives the |
|
character in case of parity error detection has been changed. The new error |
|
policy how the process receives the character in case of parity error |
|
detection is passed as \a policy. |
|
|
|
\sa QSerialPort::dataErrorPolicy |
|
*/ |
|
|
|
/*! |
|
\property QSerialPort::error |
|
\brief the error status of the serial port |
|
|
|
The I/O device status returns an error code. For example, if open() |
|
returns false, or a read/write operation returns -1, this property can |
|
be used to figure out the reason why the operation failed. |
|
|
|
The error code is set to the default QSerialPort::NoError after a call to |
|
clearError() |
|
*/ |
|
QSerialPort::SerialPortError QSerialPort::error() const |
|
{ |
|
Q_D(const QSerialPort); |
|
return d->error; |
|
} |
|
|
|
void QSerialPort::clearError() |
|
{ |
|
setError(QSerialPort::NoError); |
|
} |
|
|
|
/*! |
|
\fn void QSerialPort::error(SerialPortError error) |
|
|
|
This signal is emitted after the error has been changed. The new erroris |
|
passed as \a error. |
|
|
|
\sa QSerialPort::error |
|
*/ |
|
|
|
/*! |
|
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 QSerialPort::readBufferSize() const |
|
{ |
|
Q_D(const QSerialPort); |
|
return d->readBufferMaxSize; |
|
} |
|
|
|
/*! |
|
Sets the size of QSerialPort's internal read buffer to be \a |
|
size bytes. |
|
|
|
If the buffer size is limited to a certain size, QSerialPort |
|
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 QSerialPort::setReadBufferSize(qint64 size) |
|
{ |
|
Q_D(QSerialPort); |
|
|
|
if (d->readBufferMaxSize == size) |
|
return; |
|
d->readBufferMaxSize = size; |
|
} |
|
|
|
/*! |
|
\reimp |
|
|
|
Always returns true. The serial port is a sequential device. |
|
*/ |
|
bool QSerialPort::isSequential() const |
|
{ |
|
return true; |
|
} |
|
|
|
/*! |
|
\reimp |
|
|
|
Returns the number of incoming bytes that are waiting to be read. |
|
|
|
\sa bytesToWrite(), read() |
|
*/ |
|
qint64 QSerialPort::bytesAvailable() const |
|
{ |
|
Q_D(const QSerialPort); |
|
return d->bytesAvailable() + 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 QSerialPort::bytesToWrite() const |
|
{ |
|
Q_D(const QSerialPort); |
|
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 QSerialPort::canReadLine() const |
|
{ |
|
Q_D(const QSerialPort); |
|
const bool hasLine = (d->bytesAvailable() > 0) && 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 QSerialPort::waitForReadyRead(int msecs) |
|
{ |
|
Q_D(QSerialPort); |
|
return d->waitForReadyRead(msecs); |
|
} |
|
|
|
/*! |
|
\reimp |
|
*/ |
|
bool QSerialPort::waitForBytesWritten(int msecs) |
|
{ |
|
Q_D(QSerialPort); |
|
return d->waitForBytesWritten(msecs); |
|
} |
|
|
|
/*! |
|
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 setBreakEnabled() |
|
*/ |
|
bool QSerialPort::sendBreak(int duration) |
|
{ |
|
Q_D(QSerialPort); |
|
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 sendBreak() |
|
*/ |
|
bool QSerialPort::setBreakEnabled(bool set) |
|
{ |
|
Q_D(QSerialPort); |
|
return d->setBreakEnabled(set); |
|
} |
|
|
|
/*! |
|
\reimp |
|
*/ |
|
qint64 QSerialPort::readData(char *data, qint64 maxSize) |
|
{ |
|
Q_D(QSerialPort); |
|
return d->readFromBuffer(data, maxSize); |
|
} |
|
|
|
/*! |
|
\reimp |
|
*/ |
|
qint64 QSerialPort::readLineData(char *data, qint64 maxSize) |
|
{ |
|
return QIODevice::readLineData(data, maxSize); |
|
} |
|
|
|
/*! |
|
\reimp |
|
*/ |
|
qint64 QSerialPort::writeData(const char *data, qint64 maxSize) |
|
{ |
|
Q_D(QSerialPort); |
|
return d->writeToBuffer(data, maxSize); |
|
} |
|
|
|
void QSerialPort::setError(QSerialPort::SerialPortError serialPortError, const QString &errorString) |
|
{ |
|
Q_D(QSerialPort); |
|
|
|
d->error = serialPortError; |
|
|
|
if (errorString.isNull()) |
|
setErrorString(qt_error_string(-1)); |
|
else |
|
setErrorString(errorString); |
|
|
|
emit error(serialPortError); |
|
} |
|
|
|
#include "moc_qserialport.cpp" |
|
|
|
QT_END_NAMESPACE
|
|
|