欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

QT学习笔记——串口通信

程序员文章站 2024-02-22 10:30:49
...

写一个最简单的串口助手。

QT5以后,编写串口不需要借助第三方库了,可以说方便了不少。

先建立QT项目,在.pro文件里加入下面这行代码,不然会没有串口库额昂你使用的

QT    += serialport

然后在头文件mainwindows.h中加入头文件

#include <QSerialPort>
#include <QSerialPortInfo>

其中QSerialPort是用来操作串口的,QSerialPortInfo提供串口信息

接着创建一个串口实例

    QSerialPort *serial;

由于是做一个最简单的串口助手,所以界面很简洁,把波特率之类的都预设,只留了一个串口选择,连接,清理和发送。

QT学习笔记——串口通信

串口选择这里可以直接去设备管理器里面查看串口号,然后选择预设的COM号进行连接,是如下操作

serial = new QSerialPort;
serial->setPortName(ui->comboBox->currentText());

也可以通过QSerialPort提供的功能,自动识别可利用的串口,并加入到comboBox。具体实现如下

void MainWindow::GetPort()
{
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
        QSerialPort serial;
        serial.setPort(info);
        if(serial.open(QIODevice::ReadWrite))
        {
            ui->comboBox->addItem(serial.portName());
            serial.close();
        }
    }
}

然后设置串口的一系列参数,为了方便直接赋值

serial->setBaudRate(QSerialPort::Baud9600); //设置波特率
serial->setDataBits(QSerialPort::Data8); //设置数据位
serial->setParity(QSerialPort::NoParity); //设置校验位
serial->setStopBits(QSerialPort::OneStop); //设置停止位
serial->setFlowControl(QSerialPort::NoFlowControl); //设置流控制

然后就是数据的接收和发送了

从上位机发送到下位机很直接

serial->write(ui->textEdit->toPlainText().toLatin1());

上位机接收下位机的数据分两步走

先写好数据处理函数,让接收到的数据在显示框接在已有的数据显示

void MainWindow::ReadData()
{
    QByteArray buf;
    buf = serial->readAll();
    if(!buf.isEmpty())
    {
        QString str = ui->textBrowser->toPlainText();
        str += tr(buf);
        ui->textBrowser->clear();
        ui->textBrowser->append(str);
    }
    buf.clear();
}

然后将信号与槽函数连接,当串口接收到数据就调用数据处理的函数

connect(serial, &QSerialPort::readyRead, this, &MainWindow::ReadData);

然后,一个最简单的串口助手就写完了。

用虚拟串口做测试

QT学习笔记——串口通信

贴出mainwindows.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

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

void MainWindow::ReadData()
{
    QByteArray buf;
    buf = serial->readAll();
    if(!buf.isEmpty())
    {
        QString str = ui->textBrowser->toPlainText();
        str += tr(buf);
        ui->textBrowser->clear();
        ui->textBrowser->append(str);
    }
    buf.clear();
}

void MainWindow::GetPort()
{
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
        QSerialPort serial;
        serial.setPort(info);
        if(serial.open(QIODevice::ReadWrite))
        {
            ui->comboBox->addItem(serial.portName());
            serial.close();
        }
    }
}

void MainWindow::on_pushButton_Send_clicked()
{
    serial->write(ui->textEdit->toPlainText().toLatin1());
}

void MainWindow::on_pushButton_Clear_clicked()
{
    ui->textBrowser->clear();
    ui->textEdit->clear();
}

void MainWindow::on_pushButton_clicked()
{
    if(ui->pushButton->text() == tr("连接"))
    {
        serial = new QSerialPort;
        serial->setPortName(ui->comboBox->currentText());
        serial->open(QIODevice::ReadWrite);
        serial->setBaudRate(QSerialPort::Baud9600);
        serial->setDataBits(QSerialPort::Data8);
        serial->setParity(QSerialPort::NoParity);
        serial->setStopBits(QSerialPort::OneStop);
        serial->setFlowControl(QSerialPort::NoFlowControl);
        ui->pushButton->setText(tr("断开"));

        connect(serial, &QSerialPort::readyRead, this, &MainWindow::ReadData);
    }
    else
    {
        serial->clear();
        serial->close();
        serial->deleteLater();

        ui->pushButton->setText(tr("连接"));
    }
}

 

 

 

 

相关标签: qt 串口