QT程序实现串口通信案例

一、创建QT项目

创建一个QT项目,在项目名.pro工程文件开头添加:

cpp 复制代码
QT       += serialport

二、UI界面设计

UI界面设计如下:

三、编写串口程序

  1. mainwindow.h 文件
cpp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include <QSerialPort>     //提供访问串口的功能
#include <QSerialPortInfo> //提供系统中存在的串口信息
#include <QDebug>          //debug用
#include <QMessageBox>
#include <QDateTime>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pBtn_scanPort_clicked();

    //连接串口
    void on_pBtn_connectPort_clicked();

    void on_pBtn_clearAll_clicked();

    void on_pBtn_send_clicked();

    //处理接收的消息
    void readData();

    void on_rBtn_revASCII_toggled(bool checked);

    void on_rBtn_sendASCII_toggled(bool checked);

private:
    void initData(); //定义串口对象

private:
    QSerialPort  *serial; //定义串口对象

    int open_port;  //打开串口按钮状态,0--打开串口,1--关闭串口
    int revType;    //接收类型 1--ASCII,0--Hex
    int sendType;   //发送类型 1--ASCII,0--Hex

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
  1. mainwindow.cpp 文件
cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"

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

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


//扫描串口
void MainWindow::on_pBtn_scanPort_clicked()
{
    //获取可用串口名到下拉栏
    QList<QSerialPortInfo> list = QSerialPortInfo::availablePorts();
    ui->cB_serialPort->clear(); // 清除之前端检测到的端口号
    for(int i=0; i<list.size(); i++)
    {
        ui->cB_serialPort->addItem(list.at(i).portName());
    }


}

void MainWindow::on_pBtn_connectPort_clicked()
{
    open_port = 1 - open_port;
    if(open_port==1){
       //设置串口名
        serial->setPortName(ui->cB_serialPort->currentText());
        //设置波特率
        switch (ui->cB_baudRate->currentIndex()) {
        case 0:
            serial->setBaudRate(QSerialPort::Baud115200);break;
        case 1:
            serial->setBaudRate(QSerialPort::Baud9600);break;
        default:
            break;
        }
        //设置停止位
        switch (ui->cB_stopBit->currentIndex()) {
        case 0:
            serial->setStopBits(QSerialPort::OneStop);break;
        case 1:
            serial->setStopBits(QSerialPort::OneAndHalfStop);break;
        case 2:
            serial->setStopBits(QSerialPort::TwoStop);break;
        default:
            break;
        }
        //设置数据位
        switch (ui->cB_dataBit->currentIndex()) {
        case 0:
            serial->setDataBits(QSerialPort::Data8);break;
        case 1:
            serial->setDataBits(QSerialPort::Data6);break;
        default:
            break;
        }
        //设置校验位
        switch (ui->cB_checkBit->currentIndex()) {
        case 0:
            serial->setParity(QSerialPort::NoParity);break;
        case 1:
            serial->setParity(QSerialPort::EvenParity);break;
        case 2:
            serial->setParity(QSerialPort::OddParity);break;
        default:
            break;
        }
        //连接串口
        bool isconnect = serial->open(QIODevice::ReadWrite);
        if(isconnect){
            qDebug()<<"连接串口成功";
            ui->cB_serialPort->setEnabled(false);
            ui->cB_baudRate->setEnabled(false);
            ui->cB_stopBit->setEnabled(false);
            ui->cB_dataBit->setEnabled(false);
            ui->cB_checkBit->setEnabled(false);
            ui->pBtn_connectPort->setText(tr("关闭串口"));
            //QMessageBox::information(this,"串口消息","连接串口成功");
            ui->label_portStatus->setStyleSheet("color: green;");
            ui->label_portStatus->setText(serial->portName()+" OPENED");
        }else{
            qDebug()<<"连接串口失败";
            QMessageBox::critical(this,"串口消息","连接串口失败");

        }

    }else{
        serial->clear();//清空串口数据
        serial->close();//关闭串口
        ui->cB_serialPort->setEnabled(true);
        ui->cB_baudRate->setEnabled(true);
        ui->cB_stopBit->setEnabled(true);
        ui->cB_dataBit->setEnabled(true);
        ui->cB_checkBit->setEnabled(true);
        ui->pBtn_connectPort->setText(tr("连接串口"));
        ui->label_portStatus->setStyleSheet("color: red;");
        ui->label_portStatus->setText(serial->portName()+" CLOSED");
        //QMessageBox::information(this,"串口消息","关闭串口成功");
    }
}

//清空消息
void MainWindow::on_pBtn_clearAll_clicked()
{
    if(QMessageBox::question(this,"提示","确认清空吗?")==QMessageBox::Yes){
        ui->tEdit_revMsg->clear();
        //QApplication::quit();
    }

}

//发送消息
void MainWindow::on_pBtn_send_clicked()
{
    if(serial->isOpen()){
        QString msg = ui->tEdit_sendMsg->toPlainText();
        if(sendType == 0){
            serial->write(QByteArray::fromHex(msg.toLatin1()));
        }else{
            serial->write(msg.toUtf8());
        }

    }else{
        qDebug()<<"串口未打开";
    }
}
//处理接收的消息
void MainWindow::readData()
{
    QByteArray buf = serial->readAll();
    QString date = QDateTime::currentDateTime().toString("[yyyy-MM-dd HH:mm:ss]");
    if (revType == 0) {
        ui->tEdit_revMsg->append(date + " " + buf.toHex(' ').toUpper());
    } else {
        ui->tEdit_revMsg->append(date + " " + QString::fromLatin1(buf));
    }
}

//初始化数据
void MainWindow::initData()
{
    open_port = 0;
    revType = 0;
    sendType = 0;


    ui->cB_baudRate->addItem("115200",0);
    ui->cB_baudRate->addItem("9600",1);
    ui->cB_dataBit->addItem("8",0);
    ui->cB_dataBit->addItem("6",1);
    ui->cB_checkBit->addItem("无",0);
    ui->cB_checkBit->addItem("Even",1);
    ui->cB_checkBit->addItem("Odd",2);
    ui->cB_stopBit->addItem("1",0);
    ui->cB_stopBit->addItem("1.5",1);
    ui->cB_stopBit->addItem("2",2);
    ui->rBtn_revASCII->setChecked(true);
    ui->rBtn_sendASCII->setChecked(true);
    ui->label_portStatus->setText("SERIALPORT STATUS");

    serial = new QSerialPort(this);  //初始化serial

    connect(serial,&QSerialPort::readyRead,this,&MainWindow::readData); //连接信号与槽,对信号进行处理
    this->on_pBtn_scanPort_clicked();

}


void MainWindow::on_rBtn_revASCII_toggled(bool checked)
{
    revType = 1 - revType;
    if(revType == 0){
        qDebug()<<"REVASCII====="<<revType;
    }else{
         qDebug()<<"REVHex====="<<revType;
    }
}


void MainWindow::on_rBtn_sendASCII_toggled(bool checked)
{
    sendType = 1 - sendType;
    if(sendType == 0){
        qDebug()<<"SENDSCII====="<<sendType;
    }else{
        qDebug()<<"SENDHex====="<<sendType;
    }
}

案例代码如下

【免费】QT项目-QT串口通信案例资源-CSDN下载

相关推荐
玄同7659 小时前
从 0 到 1:用 Python 开发 MCP 工具,让 AI 智能体拥有 “超能力”
开发语言·人工智能·python·agent·ai编程·mcp·trae
czy87874759 小时前
深入了解 C++ 中的 `std::bind` 函数
开发语言·c++
消失的旧时光-194310 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed
yq19820430115610 小时前
静思书屋:基于Java Web技术栈构建高性能图书信息平台实践
java·开发语言·前端
一个public的class10 小时前
你在浏览器输入一个网址,到底发生了什么?
java·开发语言·javascript
Jinkxs10 小时前
Gradle - 与Groovy/Kotlin DSL对比 构建脚本语言选择指南
android·开发语言·kotlin
&有梦想的咸鱼&10 小时前
Kotlin委托机制的底层实现深度解析(74)
android·开发语言·kotlin
BD_Marathon10 小时前
设计模式——依赖倒转原则
java·开发语言·设计模式
stevenson_aspdotnet10 小时前
QT5.15.12 编译备忘
qt
devmoon10 小时前
在 Polkadot Runtime 中添加多个 Pallet 实例实战指南
java·开发语言·数据库·web3·区块链·波卡