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

相关推荐
Main. 241 小时前
从0到1学习Qt -- 常见控件之显示类控件
qt·学习
无限进步_1 小时前
C语言动态内存的二维抽象:用malloc实现灵活的多维数组
c语言·开发语言·数据结构·git·算法·github·visual studio
froginwe111 小时前
Maven 仓库概述
开发语言
二川bro2 小时前
Python在AI领域应用全景:2025趋势与案例
开发语言·人工智能·python
CoderYanger2 小时前
优选算法-队列+宽搜(BFS):72.二叉树的最大宽度
java·开发语言·算法·leetcode·职场和发展·宽度优先·1024程序员节
疏狂难除3 小时前
随便玩玩lldb (二)
开发语言·后端·rust
星轨初途3 小时前
数据结构排序算法详解(5)——非比较函数:计数排序(鸽巢原理)及排序算法复杂度和稳定性分析
c语言·开发语言·数据结构·经验分享·笔记·算法·排序算法
b***65323 小时前
GO 快速升级Go版本
开发语言·redis·golang