当前位置:   article > 正文

Qt开发时如何与串口联接

qt开发时如何与串口联接

Qt开发时如何与串口联接

在Qt开发中,串口通信是一种常见的需求。通过串口,我们可以将数据从计算机发送到外部设备,或者从外部设备接收数据。本文将详细介绍如何在Qt中实现串口通信,并提供一个详细的实例。
在这里插入图片描述

1. 安装QtSerialPort库

首先,我们需要安装QtSerialPort库。这个库提供了串口通信的基本功能。在Qt Creator中,我们可以通过以下步骤来安装:

  1. 打开Qt Creator。
  2. 点击顶部菜单栏的"Tools"(工具)。
  3. 在下拉菜单中选择"Options"(选项)。
  4. 在弹出的窗口中,点击左侧的"Plugins"(插件)。
  5. 在搜索框中输入"serialport",然后点击搜索结果中的"Install"(安装)按钮。
  6. 等待安装完成。

2. 创建一个新的Qt项目

接下来,我们需要创建一个新的Qt项目。在Qt Creator中,我们可以通过以下步骤来创建:

  1. 点击顶部菜单栏的"File"(文件)。
  2. 在下拉菜单中选择"New File or Project"(新建文件或项目)。
  3. 在弹出的窗口中,选择"Qt Widgets Application"(Qt小部件应用程序),然后点击"Choose"(选择)按钮。
  4. 在弹出的窗口中,输入项目名称和位置,然后点击"Finish"(完成)按钮。

3. 添加串口支持

在项目中,我们需要添加串口支持。在Qt Creator中,我们可以通过以下步骤来添加:

  1. 在项目浏览器中,右键点击"src"文件夹,然后选择"Add New File or Project"(添加新文件或项目)。
  2. 在弹出的窗口中,选择"C++ Class"(C++类),然后点击"Choose"(选择)按钮。
  3. 在弹出的窗口中,输入类名(例如"SerialPort"),然后点击"Add"(添加)按钮。
  4. 在生成的"SerialPort.h"文件中,添加以下代码:
#ifndef SERIALPORT_H
#define SERIALPORT_H

#include <QIODevice>
#include <QSerialPortInfo>

class SerialPort : public QObject
{
    Q_OBJECT
public:
    explicit SerialPort(QObject *parent = nullptr);
    ~SerialPort();

    bool open(const QString &portName, qint32 baudRate = 9600);
    void close();
    bool isOpen() const;

    qint64 writeData(const QByteArray &data);
    qint64 readData(char *buffer, qint64 maxSize);

signals:
    void dataReceived(const QByteArray &data);

private slots:
    void onReadyRead();

private:
    QSerialPort *m_serialPort;
};

#endif // SERIALPORT_H
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  1. 在生成的"SerialPort.cpp"文件中,添加以下代码:
#include "SerialPort.h"
#include <QDebug>

SerialPort::SerialPort(QObject *parent) : QObject(parent)
{
}

SerialPort::~SerialPort()
{
    close();
}

bool SerialPort::open(const QString &portName, qint32 baudRate)
{
    if (isOpen()) {
        return false;
    }

    m_serialPort = new QSerialPort(this);
    m_serialPort->setPortName(portName);
    m_serialPort->setBaudRate(baudRate);
    m_serialPort->setDataBits(QSerialPort::Data8);
    m_serialPort->setParity(QSerialPort::NoParity);
    m_serialPort->setStopBits(QSerialPort::OneStop);
    m_serialPort->setFlowControl(QSerialPort::NoFlowControl);

    connect(m_serialPort, &QSerialPort::readyRead, this, &SerialPort::onReadyRead);
    connect(m_serialPort, &QSerialPort::errorOccurred, this, [this](QSerialPort::SerialPortError error) {
        if (error == QSerialPort::ResourceError) {
            qDebug() << "Error:" << m_serialPort->errorString();
        } else {
            qDebug() << "Unexpected error:" << error;
        }
    });

    return m_serialPort->open(QIODevice::ReadWrite);
}

void SerialPort::close()
{
    if (m_serialPort) {
        m_serialPort->close();
        delete m_serialPort;
        m_serialPort = nullptr;
    }
}

bool SerialPort::isOpen() const
{
    return m_serialPort && m_serialPort->isOpen();
}

qint64 SerialPort::writeData(const QByteArray &data)
{
    if (!isOpen()) {
        return -1;
    }

    return m_serialPort->write(data);
}

qint64 SerialPort::readData(char *buffer, qint64 maxSize)
{
    if (!isOpen()) {
        return -1;
    }

    return m_serialPort->read(buffer, maxSize);
}

void SerialPort::onReadyRead()
{
    QByteArray data = m_serialPort->readAll();
    emit dataReceived(data);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75

4. 使用串口通信

在主窗口中,我们可以使用SerialPort类来实现串口通信。以下是一个简单的示例:

  1. 在主窗口的头文件中,添加以下代码:
#include "SerialPort.h"
  • 1
  1. 在主窗口的源文件中,添加以下代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "SerialPort.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    if (!serialPort.isOpen()) {
        serialPort.open(ui->comboBox->currentText(), ui->spinBox->value());
        connect(&serialPort, &SerialPort::dataReceived, this, &MainWindow::onDataReceived);
    } else {
        serialPort.close();
    }
}

void MainWindow::onDataReceived(const QByteArray &data)
{
    ui->textEdit->append("Received data: " + QString::fromUtf8(data));
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  1. 在主窗口的布局文件中,添加以下代码:
<widget class="QPushButton" name="pushButton">
    <property name="text">
        <string>Connect</string>
    </property>
</widget>
<widget class="QComboBox" name="comboBox">
    <property name="editable">
        <bool>true</bool>
    </property>
</widget>
<widget class="QSpinBox" name="spinBox">
    <property name="suffix">
        <string>Baud</string>
    </property>
</widget>
<widget class="QTextEdit" name="textEdit">
</widget>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

现在,当你运行程序并点击"Connect"按钮时,程序将尝试连接到指定的串口,并在接收到数据时显示在文本框中。你可以通过修改串口号和波特率来测试不同的设备。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/979410
推荐阅读
相关标签
  

闽ICP备14008679号