(VS版)QT串口通信

最近在学习QT的串口通信,记录一下。
网上有许多关于QT串口通信的资料,但都是在Qt Creator 中运行的,我用的开发环境是VS2019,运行前要配置一下环境。

1.环境配置

①我的运行环境:
VS2019 + QT5.13.2
②在VS中用到QT的串口通信类QtSerialPort时,需要配置下环境:
在解决方案资源管理器下右击项目->属性->VC++ 目录->库目录中添加如下路径

D:\Qtanzhuang\5.13.2\msvc2017_64\lib

在这里插入图片描述
在解决方案资源管理器下右击项目->属性->链接器->输入->附加依赖项中添加如下lib文件

Qt5SerialPortd.lib

在这里插入图片描述

2.源码

main.cpp

#include "PlcConnect.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    PlcConnect w;
    w.show();
    return a.exec();
}

PlcConnect.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtWidgets/QWidget>
#include "ui_PlcConnect.h"
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>

namespace Ui 
{
    class PlcConnect;
}

class PlcConnect : public QWidget
{
    Q_OBJECT

public:
    PlcConnect(QWidget *parent = Q_NULLPTR);

private:
    Ui::PlcConnectClass ui;
    QSerialPort serial;

private slots:
    void serialPort_readyRead();

    void on_searchButton_clicked();

    void on_openButton_clicked();

    void on_sendButton_clicked();

    void on_clearButton_clicked();
};

#endif // MAINWINDOW_H

PlcConnect.cpp

#include "PlcConnect.h"
#include <QMessageBox>
#include "ui_PlcConnect.h"

PlcConnect::PlcConnect(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);

    //连接信号和槽
    QObject::connect(&serial, &QSerialPort::readyRead, this, &PlcConnect::serialPort_readyRead);

    //发送按键失能
    ui.sendButton->setEnabled(false);
    //波特率默认选择下拉第三项:9600
    ui.baudrateBox->setCurrentIndex(3);
}

//PlcConnect::~PlcConnect()
//{
//    delete ui;
//}


void PlcConnect::serialPort_readyRead()
{
    //从接收缓冲区中读取数据
    QByteArray buffer = serial.readAll();
    //从界面中读取以前收到的数据
    QString recv = ui.recvTextEdit->toPlainText();
    recv += QString(buffer);
    //清空以前的显示
    ui.recvTextEdit->clear();
    //重新显示
    ui.recvTextEdit->append(recv);
}


void PlcConnect::on_searchButton_clicked()
{
    ui.portNameBox->clear();
    //通过QSerialPortInfo查找可用串口
    //https://www.cnblogs.com/lomper/p/3959771.html
    //https://blog.csdn.net/weixin_40903194/article/details/83374711
    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
    {
        ui.portNameBox->addItem(info.portName());
    }
}


void PlcConnect::on_openButton_clicked()
{
    if (ui.openButton->text() == QString("打开串口"))
    {
        //设置串口名
        serial.setPortName(ui.portNameBox->currentText());
        //设置波特率
        serial.setBaudRate(ui.baudrateBox->currentText().toInt());
        //设置数据位数
        switch (ui.dataBitsBox->currentIndex())
        {
        case 8: serial.setDataBits(QSerialPort::Data8); break;
        default: break;
        }
        //设置奇偶校验
        switch (ui.ParityBox->currentIndex())
        {
        case 0: serial.setParity(QSerialPort::NoParity); break;
        default: break;
        }
        //设置停止位
        switch (ui.stopBitsBox->currentIndex())
        {
        case 1: serial.setStopBits(QSerialPort::OneStop); break;
        case 2: serial.setStopBits(QSerialPort::TwoStop); break;
        default: break;
        }
        //设置流控制
        serial.setFlowControl(QSerialPort::NoFlowControl);

        //打开串口
        if (!serial.open(QIODevice::ReadWrite))
        {
            QMessageBox::about(NULL, "提示", "无法打开串口!");
            return;
        }

        //下拉菜单控件失能 
        ui.portNameBox->setEnabled(false);
        ui.baudrateBox->setEnabled(false);
        ui.dataBitsBox->setEnabled(false);
        ui.ParityBox->setEnabled(false);
        ui.stopBitsBox->setEnabled(false);

        ui.openButton->setText(QString("关闭串口"));
        //发送按键使能
        ui.sendButton->setEnabled(true);
    }
    else
    {
        //关闭串口
        serial.close();

        //下拉菜单控件使能
        ui.portNameBox->setEnabled(true);
        ui.baudrateBox->setEnabled(true);
        ui.dataBitsBox->setEnabled(true);
        ui.ParityBox->setEnabled(true);
        ui.stopBitsBox->setEnabled(true);

        ui.openButton->setText(QString("打开串口"));
        //发送按键失能
        ui.sendButton->setEnabled(false);
    }
}


void PlcConnect::on_sendButton_clicked()
{
    //获取界面上的数据并转换成utf8格式的字节流
    QByteArray data = ui.sendTextEdit->toPlainText().toUtf8();
    serial.write(data);
}


void PlcConnect::on_clearButton_clicked()
{
    ui.recvTextEdit->clear();
}

效果:
在这里插入图片描述

参考博客:
https://www.cnblogs.com/forever-kenlen-ja/p/7115377.html
https://blog.csdn.net/u014695839/article/details/50611549
https://blog.csdn.net/zbw1185/article/details/51496663
工程链接:
链接:https://pan.baidu.com/s/18zFX-ys0PcLZrzW50N5tTw
提取码:fvul

  • 13
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
VS2015 中使用 Qt 进行串口通信开发,需要先安装 Qt 插件并配置好环境。具体步骤如下: 1. 下载并安装 Qt VS Tools 插件,可以在 Visual Studio 的“扩展和更新”中搜索并安装。 2. 在 Visual Studio 中创建一个 Qt 项目,选择“Qt Console Application”或“Qt Widgets Application”。 3. 在项目属性中配置 Qt 本和路径,以及包含的模块。 4. 在代码中引入 QtSerialPort 模块,并使用其提供的类进行串口通信。 以下是一个简单的示例代码: ```cpp #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 查找可用的串口 QList<QSerialPortInfo> portList = QSerialPortInfo::availablePorts(); foreach (const QSerialPortInfo &portInfo, portList) { qDebug() << "Port Name: " << portInfo.portName(); qDebug() << "Description: " << portInfo.description(); qDebug() << "Manufacturer: " << portInfo.manufacturer(); } // 打开串口 QSerialPort serialPort; serialPort.setPortName("COM1"); serialPort.setBaudRate(QSerialPort::Baud9600); serialPort.setDataBits(QSerialPort::Data8); serialPort.setParity(QSerialPort::NoParity); serialPort.setStopBits(QSerialPort::OneStop); if (serialPort.open(QIODevice::ReadWrite)) { qDebug() << "Serial Port Opened!"; } else { qDebug() << "Failed to Open Serial Port!"; } // 发送数据 QByteArray sendData("Hello World!"); serialPort.write(sendData); // 接收数据 QByteArray receiveData = serialPort.readAll(); qDebug() << "Received Data: " << receiveData; // 关闭串口 serialPort.close(); return a.exec(); } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

boss-dog

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

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

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

打赏作者

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

抵扣说明:

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

余额充值