11. Qt5 串口通信

QT +=serialport

在这里插入图片描述

mainwindow.h

#include <QMainWindow>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDebug>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pbLink_clicked();
	void receiveInfo(); // 接收数据
private:
    Ui::MainWindow *ui;
    QStringList getSerialNameList(); // 获取本地串口的列表
    void openSerial();   // 打开串口
    void closeSerial();  // 关闭串口
    QSerialPort * serialPort;
};

mainwindow.cpp

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

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

    serialPort = new QSerialPort(this);
    connect(serialPort,SIGNAL(readyRead()),this,SLOT(receiveInfo()));

    // 串口列表
    QStringList serialNameList = getSerialNameList() ;
    ui->cbSerialName->addItems(serialNameList);

    // 波特率列表
    QStringList serialBaudList ;
    serialBaudList << "1200" << "2400" << "4800" << "9600"
                   <<  "19200" << "38400" << "57600" << "115200" ;
    ui->cbBaudRate->addItems(serialBaudList);
    ui->cbBaudRate->setCurrentText("9600");

    // 数据位
    QStringList serialDataBitList;
    serialDataBitList << "5" << "6" << "7" << "8" ;
    ui->cbDataBit->addItems(serialDataBitList);
    ui->cbDataBit->setCurrentText("8");

    // 控制流
    QStringList serialFlowControlList;
    serialFlowControlList << "无流控" << "硬件流控" << "软件流控" ;
    ui->cbFlowControl->addItems(serialFlowControlList);

    // 校验位
    QStringList serialParityList;
    serialParityList << "无校验" << "奇校验(odd)" << "偶校验(even)"
                     << "固定1(mark)" << "固定0(space)";
    ui->cbParity->addItems(serialParityList);

    // 停止位
    QStringList serialStopList;
    serialStopList << "1" << "1.5" << "2" ;
    ui->cbStop->addItems(serialStopList);

}


QStringList MainWindow::getSerialNameList()
{
    QStringList serialNameList;
    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
    {
        serialNameList << info.portName();
    }
    return serialNameList;
}

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

void MainWindow::on_pbLink_clicked()
{
    if(ui->pbLink->text() == "连接串口")
    {
        ui->pbLink->setText("关闭串口");
        openSerial();
    }else if(ui->pbLink->text() == "关闭串口")
    {
        ui->pbLink->setText("连接串口");
        closeSerial();
    }
}


void MainWindow::openSerial()
{
    serialPort->setPortName(ui->cbSerialName->currentText());  // 设置串口名

    if(serialPort->isOpen())
    {
        serialPort->clear();
        serialPort->close();
    }

    / 设置波特率
    int baudRate = ui->cbBaudRate->currentText().toInt();
    switch (baudRate) {
    case 1200:
        serialPort->setBaudRate(QSerialPort::Baud1200,QSerialPort::AllDirections);//设置波特率和读写方向
        break;
    case 2400:
        serialPort->setBaudRate(QSerialPort::Baud2400,QSerialPort::AllDirections);//设置波特率和读写方向
        break;
    case 4800:
        serialPort->setBaudRate(QSerialPort::Baud4800,QSerialPort::AllDirections);//设置波特率和读写方向
        break;
    case 9600:
        serialPort->setBaudRate(QSerialPort::Baud9600,QSerialPort::AllDirections);//设置波特率和读写方向
        break;
    case 19200:
        serialPort->setBaudRate(QSerialPort::Baud19200,QSerialPort::AllDirections);//设置波特率和读写方向
        break;
    case 38400:
        serialPort->setBaudRate(QSerialPort::Baud38400,QSerialPort::AllDirections);//设置波特率和读写方向
        break;
    case 57600:
        serialPort->setBaudRate(QSerialPort::Baud57600,QSerialPort::AllDirections);//设置波特率和读写方向
        break;
    case 115200:
        serialPort->setBaudRate(QSerialPort::Baud115200,QSerialPort::AllDirections);//设置波特率和读写方向
        break;
    default:
        serialPort->setBaudRate(QSerialPort::UnknownBaud,QSerialPort::AllDirections);//设置波特率和读写方向
        break;
    }

    //设置数据位
    int dataBit = ui->cbDataBit->currentText().toInt();
    switch (dataBit) {
    case 5:
        serialPort->setDataBits(QSerialPort::Data5); //数据位为5位
        break;
    case 6:
        serialPort->setDataBits(QSerialPort::Data6); //数据位为6位
        break;
    case 7:
        serialPort->setDataBits(QSerialPort::Data7); //数据位为7位
        break;
    case 8:
        serialPort->setDataBits(QSerialPort::Data8); //数据位为8位
        break;
    default:
        serialPort->setDataBits(QSerialPort::UnknownDataBits);
        break;
    }

    /// 设置流控制
    QString flowControlStr = ui->cbFlowControl->currentText();
    if(flowControlStr == "无流控" )
        serialPort->setFlowControl(QSerialPort::NoFlowControl);//无流控制
    else if(flowControlStr == "硬件流控" )
        serialPort->setFlowControl(QSerialPort::HardwareControl);//硬件流控
    else if(flowControlStr == "软件流控")
        serialPort->setFlowControl(QSerialPort::SoftwareControl);//硬件流控
    else
        serialPort->setFlowControl(QSerialPort::UnknownFlowControl);

    /// 设置校验位
    QString parityStr = ui->cbParity->currentText();
    if(parityStr == "无校验" )
        serialPort->setParity(QSerialPort::NoParity);	//无校验位
    else if(parityStr == "奇校验(odd)" )
        serialPort->setParity(QSerialPort::OddParity);	//奇校验
    else if(parityStr == "偶校验(even)")
        serialPort->setParity(QSerialPort::EvenParity);	//偶校验
    else if(parityStr == "固定1(mark)" )
        serialPort->setParity(QSerialPort::MarkParity);	//固定为1
    else if(parityStr == "固定0(space)")
        serialPort->setParity(QSerialPort::SpaceParity);	//固定为0
    else
        serialPort->setParity(QSerialPort::UnknownParity);

     设置停止位
    QString stopBitsStr = ui->cbStop->currentText();
    if(stopBitsStr == "1")
        serialPort->setStopBits(QSerialPort::OneStop);  //一位停止位
    else if(stopBitsStr == "1.5")
        serialPort->setStopBits(QSerialPort::OneAndHalfStop);  //1.5
    else if(stopBitsStr == "2")
        serialPort->setStopBits(QSerialPort::TwoStop);  //2
    else
        serialPort->setStopBits(QSerialPort::UnknownStopBits);


    if(!serialPort->open(QIODevice::ReadWrite))
    {
        ui->textEdit->append("---> 打开串口连接失败" );
        return ;
    }else
    {
        ui->textEdit->append("---> 打开串口连接成功" );
    }

}

void MainWindow::closeSerial()
{
    if(serialPort->isOpen())
    {
        serialPort->clear();
        serialPort->close();
        ui->textEdit->append("---> 关闭串口连接" );
    }
}

void MainWindow::on_pbLink_clicked()
{
    if(ui->pbLink->text() == "连接串口")
    {
        ui->pbLink->setText("关闭串口");
        openSerial();
    }else if(ui->pbLink->text() == "关闭串口")
    {
        ui->pbLink->setText("连接串口");
        closeSerial();
    }
}


void MainWindow::receiveInfo()
{
     QByteArray data  = serialPort.readAll();
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
QT5上位机中进行串口通信,首先需要下载QT并安装。你可以选择从国内镜像网站下载,也可以从官方网站下载。这里提供一些参考链接,你可以根据自己的需求选择合适的下载方式。同时,QT中提供了QSerialPortInfo类来获取串口信息。你可以使用get_portinfo()函数来获取当前设备的所有串口信息,并将可用的串口端口号添加到相应的下拉菜单中。在代码中,你需要包含<QtSerialPort/QtSerialPort>头文件来访问串口功能以及获取系统中存在的串口信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [QT上位机串口通信工具实现之概述篇](https://blog.csdn.net/qq_43614246/article/details/123064123)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [VS + Qt实现上位机串口通信:简单界面](https://blog.csdn.net/qq_43104187/article/details/107675293)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FlyingO123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值