summaryrefslogtreecommitdiffstats
path: root/examples/serialport/terminal
diff options
context:
space:
mode:
authorIvan Solovev <ivan.solovev@qt.io>2023-02-08 14:01:07 +0100
committerIvan Solovev <ivan.solovev@qt.io>2023-02-10 11:43:57 +0100
commit811c0f319862f15bfcf5799298e0fbc22516c94c (patch)
tree3e41a9216f5eb3becd531c779591ec63c504636b /examples/serialport/terminal
parentb114f04ed2b900884a4df5bc2ce855addbd467c9 (diff)
Improve Terminal example
Extend the example to handle bytesWritten() signal. This allows to demonstrate both async read and async write with one example. Extend the example description to cover these changes. Apart from that do some regular cleanups: * Do not use Example in the name * Update screenshot * add Connectivity category Fixes: QTBUG-108870 Task-number: QTBUG-108868 Pick-to: 6.5 Change-Id: I013b66189fe321773f1fd7a8dcaf98c380833d8c Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
Diffstat (limited to 'examples/serialport/terminal')
-rw-r--r--examples/serialport/terminal/mainwindow.cpp52
-rw-r--r--examples/serialport/terminal/mainwindow.h6
-rw-r--r--examples/serialport/terminal/mainwindow.ui2
3 files changed, 53 insertions, 7 deletions
diff --git a/examples/serialport/terminal/mainwindow.cpp b/examples/serialport/terminal/mainwindow.cpp
index 56cf998d..d8c02122 100644
--- a/examples/serialport/terminal/mainwindow.cpp
+++ b/examples/serialport/terminal/mainwindow.cpp
@@ -9,19 +9,25 @@
#include <QLabel>
#include <QMessageBox>
+#include <QTimer>
+
+#include <chrono>
+
+static constexpr std::chrono::seconds kWriteTimeout = std::chrono::seconds{5};
//! [0]
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
m_ui(new Ui::MainWindow),
+//! [0]
m_status(new QLabel),
m_console(new Console),
- m_settings(new SettingsDialog(this)),
+ m_settings(new SettingsDialog(this)),
+ m_timer(new QTimer(this)),
//! [1]
m_serial(new QSerialPort(this))
-//! [1]
{
-//! [0]
+//! [1]
m_ui->setupUi(this);
m_console->setEnabled(false);
setCentralWidget(m_console);
@@ -36,9 +42,12 @@ MainWindow::MainWindow(QWidget *parent) :
initActionsConnections();
connect(m_serial, &QSerialPort::errorOccurred, this, &MainWindow::handleError);
+ connect(m_timer, &QTimer::timeout, this, &MainWindow::handleWriteTimeout);
+ m_timer->setSingleShot(true);
//! [2]
connect(m_serial, &QSerialPort::readyRead, this, &MainWindow::readData);
+ connect(m_serial, &QSerialPort::bytesWritten, this, &MainWindow::handleBytesWritten);
//! [2]
connect(m_console, &Console::getData, this, &MainWindow::writeData);
//! [3]
@@ -93,8 +102,8 @@ void MainWindow::closeSerialPort()
void MainWindow::about()
{
- QMessageBox::about(this, tr("About Simple Terminal"),
- tr("The <b>Simple Terminal</b> example demonstrates how to "
+ QMessageBox::about(this, tr("About Serial Terminal"),
+ tr("The <b>Serial Terminal</b> example demonstrates how to "
"use the Qt Serial Port module in modern GUI applications "
"using Qt, with a menu bar, toolbars, and a status bar."));
}
@@ -102,7 +111,16 @@ void MainWindow::about()
//! [6]
void MainWindow::writeData(const QByteArray &data)
{
- m_serial->write(data);
+ const qint64 written = m_serial->write(data);
+ if (written == data.size()) {
+ m_bytesToWrite += written;
+ m_timer->start(kWriteTimeout);
+ } else {
+ const QString error = tr("Failed to write all data to port %1.\n"
+ "Error: %2").arg(m_serial->portName(),
+ m_serial->errorString());
+ showWriteError(error);
+ }
}
//! [6]
@@ -124,6 +142,23 @@ void MainWindow::handleError(QSerialPort::SerialPortError error)
}
//! [8]
+//! [9]
+void MainWindow::handleBytesWritten(qint64 bytes)
+{
+ m_bytesToWrite -= bytes;
+ if (m_bytesToWrite == 0)
+ m_timer->stop();
+}
+//! [9]
+
+void MainWindow::handleWriteTimeout()
+{
+ const QString error = tr("Write operation timed out for port %1.\n"
+ "Error: %2").arg(m_serial->portName(),
+ m_serial->errorString());
+ showWriteError(error);
+}
+
void MainWindow::initActionsConnections()
{
connect(m_ui->actionConnect, &QAction::triggered, this, &MainWindow::openSerialPort);
@@ -139,3 +174,8 @@ void MainWindow::showStatusMessage(const QString &message)
{
m_status->setText(message);
}
+
+void MainWindow::showWriteError(const QString &message)
+{
+ QMessageBox::warning(this, tr("Warning"), message);
+}
diff --git a/examples/serialport/terminal/mainwindow.h b/examples/serialport/terminal/mainwindow.h
index a0fcb62a..975f9a40 100644
--- a/examples/serialport/terminal/mainwindow.h
+++ b/examples/serialport/terminal/mainwindow.h
@@ -11,6 +11,7 @@
QT_BEGIN_NAMESPACE
class QLabel;
+class QTimer;
namespace Ui {
class MainWindow;
@@ -37,17 +38,22 @@ private slots:
void readData();
void handleError(QSerialPort::SerialPortError error);
+ void handleBytesWritten(qint64 bytes);
+ void handleWriteTimeout();
private:
void initActionsConnections();
private:
void showStatusMessage(const QString &message);
+ void showWriteError(const QString &message);
Ui::MainWindow *m_ui = nullptr;
QLabel *m_status = nullptr;
Console *m_console = nullptr;
SettingsDialog *m_settings = nullptr;
+ qint64 m_bytesToWrite = 0;
+ QTimer *m_timer = nullptr;
QSerialPort *m_serial = nullptr;
};
diff --git a/examples/serialport/terminal/mainwindow.ui b/examples/serialport/terminal/mainwindow.ui
index 452fdd53..be0861f3 100644
--- a/examples/serialport/terminal/mainwindow.ui
+++ b/examples/serialport/terminal/mainwindow.ui
@@ -11,7 +11,7 @@
</rect>
</property>
<property name="windowTitle">
- <string>Simple Terminal</string>
+ <string>Serial Terminal</string>
</property>
<widget class="QWidget" name="centralWidget">
<layout class="QVBoxLayout" name="verticalLayout"/>