【qt】QT上位机开发之串口助手——QT下的串口编程

来源

B站大学
示例界面:
在这里插入图片描述
在这里插入图片描述

  • 提示:创建完工程可以先编译一下,检查工程的创建是否有问题,防止后续编写完之后才发现有问题得不偿失。
  • 注意:所建工程存放的目录中一定不能要有中文名!
  • 解决:main.cpp中加入以下语句,解决运行窗口与ui界面窗口大小显示不匹配的问题。
if(QT_VERSION>=QT_VERSION_CHECK(5,6,0))
        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

1. 设计ui界面

  1. 接收框

接收别的设备发来的数据。使用Plain Text Edit控件。
在这里插入图片描述
将接收框的属性改为只读模式。
在这里插入图片描述

  1. 信息框

添加左下侧信息框(串口号、波特率、数据位、停止位、校验位、流控) —> Combo Box + Label 控件
在这里插入图片描述

  1. 发送框

使用助手软件给别的设备发送数据。使用LineEdit控件。
在这里插入图片描述

  1. 功能按钮

打开、关闭、发送、清空串口按钮 --> Push Button
广告位 --> Group Box + Label
在这里插入图片描述
运行看效果:
在这里插入图片描述

  1. 调整布局

在这里插入图片描述

  1. 向combo box中添加选项

双击控件 -> ➕号
在这里插入图片描述
并设置默认值:
在这里插入图片描述

  1. 改控件名(自行)
  2. 添加电脑的端口号

在.pro文件中添加类
在这里插入图片描述
串口号combo box使用代码将其信息加上去(widget.cpp):

#include <QSerialPortInfo>

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

    QStringList serialPortName;
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){
        serialPortName << info.portName();
    }
    ui->serialName->addItems(serialPortName);
}

运行查看效果:此时端口号已经被添加到了combo box中
在这里插入图片描述

2. 实现逻辑功能

  1. 新建端口对象

widget.h:

// 引用头文件
#include <QSerialPort>

// 在public中声明对象
public:
	QSerialPort serialPort;

widget.cpp

// new一个对象,主函数中
serialPort = new QSerialPort(this);
  1. 实现“打开串口”按钮功能

相关变量在QSerialPort类中已定义好,我们可以查看一下(帮助栏中):
在这里插入图片描述
打开串口的同时对串口进行初始化(左侧的信息栏)

void Widget::on_open_serial_clicked()
{
    QSerialPort::BaudRate baudRate;
    QSerialPort::DataBits dataBits;
    QSerialPort::StopBits stopBits;
    QSerialPort::Parity checkBits;

    if(ui->baud_rate->currentText() == "4800"){
        baudRate = QSerialPort::Baud4800;
    }else if(ui->baud_rate->currentText() == "9600"){
        baudRate = QSerialPort::Baud9600;
    }else if(ui->baud_rate->currentText() == "115200"){
        baudRate = QSerialPort::Baud115200;
    }

    if(ui->data_bits->currentText() == "5"){
        dataBits = QSerialPort::Data5;
    }else if(ui->data_bits->currentText() == "6"){
        dataBits = QSerialPort::Data6;
    }else if(ui->data_bits->currentText() == "7"){
        dataBits = QSerialPort::Data7;
    }else if(ui->data_bits->currentText() == "8"){
        dataBits = QSerialPort::Data8;
    }

    if(ui->stop_bits->currentText() == "1"){
        stopBits = QSerialPort::OneStop;
    }else if(ui->stop_bits->currentText() == "1.5"){
        stopBits = QSerialPort::OneAndHalfStop;
    }else if(ui->stop_bits->currentText() == "2"){
        stopBits = QSerialPort::TwoStop;
    }

    if(ui->check_bits->currentText() == "none"){
        checkBits = QSerialPort::NoParity;
    }

    serialPort->setPortName(ui->serialName->currentText());
    serialPort->setBaudRate(baudRate);
    serialPort->setDataBits(dataBits);
    serialPort->setStopBits(stopBits);
    serialPort->setParity(checkBits);

    if(serialPort->open(QIODevice::ReadWrite) == true){
        QMessageBox::information(this, "提示", "打开成功");
    }
    else{
        QMessageBox::critical(this, "提示", "失败");
    }
}

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

  1. 实现“关闭串口”按钮功能
void Widget::on_close_serial_clicked()
{
    serialPort->close();
}
  1. 实现接收框功能

查看信号说明,单从名字来看,readyRead()最符合我们需要。
在这里插入图片描述
widget.h

#include <QString>
private slots:
    void serialPort_readRead_slot();

widget.cpp

// 关联串口和槽函数获取输入
    connect(serialPort, SIGNAL(readyRead()), this, SLOT(serialPort_readRead_slot()));
void Widget::serialPort_readRead_slot(){
    QString buf;
    buf = QString(serialPort->readAll());
    ui->data_receiveWin->appendPlainText(buf);
}
  1. 实现发送数据功能
void Widget::on_send_data_clicked()
{
    // 转成char*类型
    serialPort->write(ui->send_data->text().toLocal8Bit().data());
}
  1. 实现清空发送框功能
void Widget::on_clear_data_clicked()
{
    ui->data_receiveWin->clear();
}

总体效果还要自己链接开发板进行调试。

QT5串口编程可以用于编写简单的上位机,通过串口与下位机进行通信。下面是一个简单的上位机编写示例: 首先,要在QT项目中加入串口模块,可以通过在.pro文件中加入以下代码实现: ``` QT += serialport ``` 接下来,创建一个新的类,命名为SerialPort,继承自QObject,并添加以下代码: ```cpp #include "serialport.h" SerialPort::SerialPort(QObject *parent) : QObject(parent) { serial = new QSerialPort(this); connect(serial, &QSerialPort::readyRead, this, &SerialPort::readData); } void SerialPort::openPort(QString portName, qint32 baudRate) { serial->setPortName(portName); serial->setBaudRate(baudRate); if(serial->open(QIODevice::ReadWrite)) { qDebug() << "Serial port is open"; } else { qDebug() << "Serial port failed to open"; } } void SerialPort::closePort() { if(serial->isOpen()) { serial->close(); qDebug() << "Serial port is closed"; } } void SerialPort::readData() { QByteArray data = serial->readAll(); qDebug() << "Received data: " << data; // 在这里可以对接收到的数据进行处理 } void SerialPort::writeData(QByteArray data) { if(serial->isOpen()) { serial->write(data); qDebug() << "Sent data: " << data; } else { qDebug() << "Serial port is not open"; } } ``` 在主窗口中,可以使用SerialPort类的实例来控制串口的打开、关闭和数据的读写,可以通过按钮来触发相应的操作。下面是一个简单的主窗口实现: ```cpp #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); serialPort = new SerialPort(this); connect(ui->openButton, &QPushButton::clicked, this, &MainWindow::openPort); connect(ui->closeButton, &QPushButton::clicked, this, &MainWindow::closePort); connect(ui->sendButton, &QPushButton::clicked, this, &MainWindow::sendData); } MainWindow::~MainWindow() { delete ui; } void MainWindow::openPort() { QString portName = ui->portComboBox->currentText(); qint32 baudRate = ui->baudRateComboBox->currentText().toInt(); serialPort->openPort(portName, baudRate); } void MainWindow::closePort() { serialPort->closePort(); } void MainWindow::sendData() { QString data = ui->sendLineEdit->text(); serialPort->writeData(data.toUtf8()); ui->sendLineEdit->clear(); } ``` 在QT设计器中,可以创建一个MainWindow窗口,包含一个QComboBox用于选择串口号,一个QComboBox用于选择波特率,一个QLineEdit用于输入发送的数据,以及几个QPushButton用于触发相应的操作。 以上就是一个简单的QT5串口编程的上位机实现,你可以根据具体的需求进行进一步的修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值