QT简单串口通信终端实现
创始人
2024-03-05 06:33:30

1.工程文件

工程文件中添加serilport

QT += serialport

2.主程序

主程序文件main.cpp

#include "mainwindow.h"
#include 
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
 
    return a.exec();
}
 

3.文本控制台类

控制台类头文件console.h

#ifndef CONSOLE_H
#define CONSOLE_H
 
#include 
 
class Console : public QPlainTextEdit
{
    Q_OBJECT
 
signals:
    void getData(const QByteArray &data);
 
public:
    explicit Console(QWidget *parent = nullptr);
 
    void putData(const QByteArray &data);
    void setLocalEchoEnabled(bool set);
 
protected:
    void keyPressEvent(QKeyEvent *e) override;
    void mousePressEvent(QMouseEvent *e) override;
    void mouseDoubleClickEvent(QMouseEvent *e) override;
    void contextMenuEvent(QContextMenuEvent *e) override;
 
private:
    bool m_localEchoEnabled = false;
};
 
#endif // CONSOLE_H
 

控制台实现文件console.cpp 

#include "console.h"
 
#include 
 
Console::Console(QWidget *parent) :
    QPlainTextEdit(parent)
{
    document()->setMaximumBlockCount(100);
    QPalette p = palette();
    p.setColor(QPalette::Base, Qt::black);
    p.setColor(QPalette::Text, Qt::green);
    setPalette(p);
}
 
void Console::putData(const QByteArray &data)
{
    insertPlainText(data);
 
    QScrollBar *bar = verticalScrollBar();
    bar->setValue(bar->maximum());
}
 
void Console::setLocalEchoEnabled(bool set)
{
    m_localEchoEnabled = set;
}
 
void Console::keyPressEvent(QKeyEvent *e)
{
    switch (e->key()) {
    case Qt::Key_Backspace:
    case Qt::Key_Left:
    case Qt::Key_Right:
    case Qt::Key_Up:
    case Qt::Key_Down:
        break;
    default:
        if (m_localEchoEnabled)
            QPlainTextEdit::keyPressEvent(e);
        emit getData(e->text().toLocal8Bit());
    }
}
 
void Console::mousePressEvent(QMouseEvent *e)
{
    Q_UNUSED(e)
    setFocus();
}
 
void Console::mouseDoubleClickEvent(QMouseEvent *e)
{
    Q_UNUSED(e)
}
 
void Console::contextMenuEvent(QContextMenuEvent *e)
{
    Q_UNUSED(e)
}
 

4. 串口设置类

串口设置类头文件settingdialog.h

串口设置类实现文件settingdialog.cpp 

5. 主窗口类

主窗口类头文件mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include 
#include QT_BEGIN_NAMESPACEclass QLabel;namespace Ui {
class MainWindow;
}QT_END_NAMESPACEclass Console;
class SettingsDialog;class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void openSerialPort();void closeSerialPort();void about();void writeData(const QByteArray &data);void readData();void handleError(QSerialPort::SerialPortError error);private:void initActionsConnections();private:void showStatusMessage(const QString &message);Ui::MainWindow *m_ui = nullptr;QLabel *m_status = nullptr;Console *m_console = nullptr;SettingsDialog *m_settings = nullptr;QSerialPort *m_serial = nullptr;
};#endif // MAINWINDOW_H

主窗口实现文件mainwindow.cpp 

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "console.h"
#include "settingsdialog.h"#include 
#include MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),m_ui(new Ui::MainWindow),m_status(new QLabel),m_console(new Console),m_settings(new SettingsDialog),m_serial(new QSerialPort(this))
{m_ui->setupUi(this);setWindowTitle(tr("Serial Servo"));m_console->setEnabled(false);setCentralWidget(m_console);m_ui->actionConnect->setEnabled(true);m_ui->actionDisconnect->setEnabled(false);m_ui->actionQuit->setEnabled(true);m_ui->statusBar->addWidget(m_status);initActionsConnections();connect(m_serial, &QSerialPort::errorOccurred, this, &MainWindow::handleError);connect(m_serial, &QSerialPort::readyRead, this, &MainWindow::readData);connect(m_console, &Console::getData, this, &MainWindow::writeData);
}MainWindow::~MainWindow()
{delete m_ui;delete m_settings;
}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("Connect to %1 :%2, %3, %4, %5, %6").arg(p.name).arg(p.stringBaudRate).arg(p.stringDataBits).arg(p.stringParity).arg(p.stringStopBits).arg(p.stringFlowControl));} else {QMessageBox::critical(this, tr("Error"), m_serial->errorString());showStatusMessage(tr("Open error"));}
}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"));
}void MainWindow::about()
{QMessageBox::about(this, "About Serial Servo",tr("Serial Servo Demo"));
}void MainWindow::writeData(const QByteArray &data)
{m_serial->write(data);
}void MainWindow::readData()
{const QByteArray data = m_serial->readAll();m_console->putData(data);
}void MainWindow::handleError(QSerialPort::SerialPortError error)
{if(error == QSerialPort::ResourceError){QMessageBox::critical(this, tr("Critical Error"), m_serial->errorString());closeSerialPort();}
}void MainWindow::initActionsConnections()
{connect(m_ui->actionConnect, &QAction::triggered, this, &MainWindow::openSerialPort);connect(m_ui->actionDisconnect, &QAction::triggered, this, &MainWindow::closeSerialPort);connect(m_ui->actionQuit, &QAction::triggered, this, &MainWindow::close);connect(m_ui->actionConfigure, &QAction::triggered, m_settings, &SettingsDialog::show);connect(m_ui->actionClear, &QAction::triggered, m_console, &Console::clear);connect(m_ui->actionAbout, &QAction::triggered, this, &MainWindow::about);
}void MainWindow::showStatusMessage(const QString &message)
{m_status->setText(message);
}

6. 运行结果

相关内容

热门资讯

猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...