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下载

相关推荐
Scott9999HH1 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社2 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海2 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖3 小时前
JDK 26 新特性详解
java·开发语言
马优晨4 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区6 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大6 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai6 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜7 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa7 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio