Serielles Terminal
Zeigt, wie man verschiedene Funktionen von QSerialPort nutzt.
Terminal zeigt, wie man ein Terminal für eine einfache serielle Schnittstelle erstellt, indem man Qt Serial Port.
Dieses Beispiel zeigt die Hauptfunktionen der Klasse QSerialPort, wie Konfiguration, E/A-Implementierung und so weiter. Außerdem wird die Klasse QSerialPortInfo aufgerufen, um Informationen über die im System verfügbaren seriellen Schnittstellen anzuzeigen.
QSerialPort unterstützt zwei allgemeine Programmieransätze:
- Der asynchrone (nicht-blockierende) Ansatz. Operationen werden geplant und ausgeführt, wenn die Steuerung zur Qt-Ereignisschleife zurückkehrt. QSerialPort gibt ein Signal aus, wenn die Operation beendet ist. Zum Beispiel kehrt QSerialPort::write() sofort zurück. Wenn die Daten an die serielle Schnittstelle gesendet werden, gibt QSerialPort das Signal bytesWritten() aus.
- Der synchrone (blockierende) Ansatz. In Nicht-GUI- und Multithread-Anwendungen können die
waitFor...()
-Funktionen aufgerufen werden (d. h. QSerialPort::waitForReadyRead()), um den aufrufenden Thread anzuhalten, bis der Vorgang abgeschlossen ist.
In diesem Beispiel wird der asynchrone Ansatz demonstriert. Das Beispiel " Blocking Receiver" veranschaulicht den synchronen Ansatz.
Unser Beispiel enthält einige GUI-Widgets:
MainWindow
(terminal/mainwindow.cpp
) - ist das Hauptanwendungsfenster, das die gesamte Arbeitslogik für die Programmierung der seriellen Schnittstelle enthält, einschließlich Konfiguration, E/A-Verarbeitung usw., wobei es das QMainWindow erbt.Console
(terminal/console.cpp
) - ist das zentrale Widget des Hauptfensters, das die gesendeten oder empfangenen Daten anzeigt. Das Widget ist von der Klasse QPlainTextEdit abgeleitet.SettingsDialog
(terminal/settingsdialog.cpp
) - ist ein Dialog zur Konfiguration der seriellen Schnittstelle, sowie zur Anzeige der verfügbaren seriellen Schnittstellen und Informationen über diese.
Die serielle Schnittstelle wird im MainWindow
Konstruktor instanziiert. Das Hauptwidget wird als Elternteil übergeben, so dass das Löschen des Objekts automatisch gemäß dem Eltern- und Kind-Mechanismus in Qt erfolgt:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_ui(new Ui::MainWindow), m_serial(new QSerialPort(this)) { ...
Dieses Beispiel demonstriert die folgenden QSerialPort Signale:
- readyRead() - zeigt an, dass neue Daten empfangen wurden und somit verfügbar sind
- bytesWritten() - wird verwendet, um zu überprüfen, ob alle Daten erfolgreich geschrieben wurden
... connect(m_serial, &QSerialPort::readyRead, this, &MainWindow::readData); connect(m_serial, &QSerialPort::bytesWritten, this, &MainWindow::handleBytesWritten); ... }
Ein Klick auf die Schaltfläche Connect ruft den Slot openSerialPort()
auf:
void MainWindow::openSerialPort() { const SettingsDialog::Settings p = m_settings->settings(); m_serial->setPortName(p.name); m_serial->setBaudRate(p.baudRate); m_serial->setDataBits(p.dataBits); m_serial->setParity(p.parity); m_serial->setStopBits(p.stopBits); m_serial->setFlowControl(p.flowControl); if (m_serial->open(QIODevice::ReadWrite)) { m_console->setEnabled(true); m_console->setLocalEchoEnabled(p.localEchoEnabled); m_ui->actionConnect->setEnabled(false); m_ui->actionDisconnect->setEnabled(true); m_ui->actionConfigure->setEnabled(false); showStatusMessage(tr("Connected to %1 : %2, %3, %4, %5, %6") .arg(p.name, p.stringBaudRate, p.stringDataBits, p.stringParity, p.stringStopBits, p.stringFlowControl)); } else { QMessageBox::critical(this, tr("Error"), m_serial->errorString()); showStatusMessage(tr("Open error")); } }
In diesem Slot werden die Einstellungen von SettingsDialog
gelesen und es wird versucht, die serielle Schnittstelle entsprechend zu öffnen und zu initialisieren. Bei Erfolg wird in der Statusleiste eine Meldung angezeigt, dass das Öffnen mit der angegebenen Konfiguration erfolgreich war; andernfalls wird eine Messagebox mit dem entsprechenden Fehlercode und einer Meldung angezeigt. Wenn die Einstellungen für die serielle Schnittstelle noch nie aufgerufen wurden, versucht das Terminal, die Schnittstelle mit den Standardeinstellungen zu öffnen: 9600 8N1.
Durch Klicken auf die Schaltfläche Trennen wird der Slot closeSerialPort()
aufgerufen:
void MainWindow::closeSerialPort() { if (m_serial->isOpen()) m_serial->close(); m_console->setEnabled(false); m_ui->actionConnect->setEnabled(true); m_ui->actionDisconnect->setEnabled(false); m_ui->actionConfigure->setEnabled(true); showStatusMessage(tr("Disconnected")); }
In diesem Fall wird die Verbindung durch das Schließen der seriellen Schnittstelle beendet.
Wenn Sie auf die Schaltfläche Konfigurieren klicken, wird der Slot show()
aufgerufen, der zum Widget SettingsDialog
gehört.
Diese Methode (terminal/settingsdialog.cpp
) zeigt die SettingsDialog
an, in der der Benutzer die gewünschte serielle Schnittstelle auswählen, die Informationen über die ausgewählte Schnittstelle einsehen und die gewünschten Parameter der gegebenen seriellen Schnittstelle einstellen kann.
Daten schreiben
Die Eingabe von Zeichen in der Konsole ruft den Slot writeData()
auf:
void MainWindow::writeData(const QByteArray &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); } }
Dieser Slot sendet die im angegebenen Konsolen-Widget eingegebenen Zeichen an die serielle Schnittstelle - siehe terminal/console.cpp
. Er startet auch einen Timer, um zu verfolgen, ob der Schreibvorgang erfolgreich war oder nicht. Wir verwenden das Signal bytesWritten(), um sicherzustellen, dass alle Bytes tatsächlich geschrieben werden. Es ist mit dem Slot MainWindow::handleBytesWritten()
verbunden:
void MainWindow::handleBytesWritten(qint64 bytes) { m_bytesToWrite -= bytes; if (m_bytesToWrite == 0) m_timer->stop(); }
Daten lesen
Wenn die serielle Schnittstelle neue Daten empfängt, wird das Signal readyRead() ausgegeben, und dieses Signal ist mit dem Steckplatz MainWindow::readData()
verbunden:
void MainWindow::readData() { const QByteArray data = m_serial->readAll(); m_console->putData(data); }
Dieser Slot liest die Daten von der seriellen Schnittstelle und zeigt sie im Konsolen-Widget an.
Ausführen des Beispiels
Zum Ausführen des Beispiels von Qt Creatorauszuführen, öffnen Sie den Modus Welcome und wählen Sie das Beispiel aus Examples aus. Weitere Informationen finden Sie unter Erstellen und Ausführen eines Beispiels.
Siehe auch Blockieren des Empfängers.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.