使用Qt编写一个串口调试助手


前言

前几天使用stm32时经常使用到串口调试助手来调试程序,然后今天就想着自己能不能也写一个串口调试助手。然后就开始找资料。最后写出一个串口调试助手。结果使用在stm32上时发现会终止我的stm32上运行的程序,但是在51单片机上却可以运行成功。(具体原因我也不清楚)

一、开发环境

  1. Qt creator
  2. 辅助环境:89C51上跑串口程序(主机发送数据给单片机,单片机返回数据给主机的程序)。

二、串口调试助手组成

  1. .pro文件 在QT += core gui后面加上serialport

代码如下(示例):

QT    += core gui serialport
  1. .ui文件

在这里插入图片描述
3. 串口读取数据
当串口有数据接收时会触发readyRead()信号

connect(serial, &QSerialPort::readyRead, this, &MainWindow::readData);      //读取数据
  1. 往串口写数据
serial->write(msg.toUtf8());   

三、各文件代码

mainwindow.h代码如下(示例):

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

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

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void serialInit();      //串口初始化程序

private slots:
    void on_pushButton_clicked();

    void on_ButtonClear_clicked();

    void on_ButtonSend_clicked();

    void readData();

private:
    Ui::MainWindow *ui;
    QSerialPort * serial;          //串口对象
    char serialFlag = 0;           //串口状态:0为关闭,1为打开
    QSerialPortInfo serialInfo[5];//定义串口信息数组存放可使用的串口
};
#endif // MAINWINDOW_H

mainwindow.cpp代码如下(示例):

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

#include <QDebug>

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

    serialInit();       //串口的初始化

    connect(serial, &QSerialPort::readyRead, this, &MainWindow::readData);      //读取数据
}

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

void MainWindow::on_pushButton_clicked()
{
    if(0 == serialFlag)
    {
        for(int i=0; i<5; i++)
        {
            if(serialInfo[i].portName() == ui->BoxPort->currentText())     //更新选中的串口
            {
                serial->setPort(serialInfo[i]);
            }
        }

        if(serial->open(QIODevice::ReadWrite))      //开启串口
        {
            serialFlag = 1;
            ui->labelState->setText("打开");      //label显示串口状态
            serial->setPortName(ui->BoxPort->currentText());    //设置端口名
            serial->setBaudRate(ui->BoxBaudRate->currentText().toInt());    //设置波特率
            serial->setDataBits(QSerialPort::Data8);    //设置8个数据位
            serial->setParity(QSerialPort::NoParity);   //设置无校验位
            serial->setStopBits(QSerialPort::OneStop);  //设置停止位
            serial->setFlowControl(QSerialPort::NoFlowControl);     //设置无流控制
        }
    }
    else if(1 == serialFlag)
    {
        serial->close();
        serialFlag = 0;
        ui->labelState->setText("关闭");
    }
}

void MainWindow::on_ButtonClear_clicked()
{
    ui->textReceive->clear();       //清空文本内容
}

void MainWindow::on_ButtonSend_clicked()
{
    QString msg = ui->textSend->toPlainText();        //获取文本输入框的内容
    serial->write(msg.toUtf8());        //转成字节数组发送
}

void MainWindow::readData()
{
    QByteArray buf;
    buf = serial->readAll();        //读取串口数据
    ui->textReceive->append(tr(buf));       //追加串口内容
}

void MainWindow::serialInit()
{
    int i = 0;
    //类似for循环查找本机的可使用的串口
    foreach(const QSerialPortInfo & info, QSerialPortInfo::availablePorts())    
    {
        qDebug() << "portName:" << info.portName();
        qDebug() << "Description:" << info.description();

        serialInfo[i] = info;		//定义5个串口信息数组保存各个串口的信息
        serial->setPort(info);      //绑定串口
        if(serial->open(QIODevice::ReadWrite))	//第一次打开串口,看看串口能不能正常打开
        {
            ui->BoxPort->addItem(info.portName());
            serial->close();		//初始化后默认串口关闭的
        }
        i++;
    }

    QStringList baudList;
    QStringList parityList;
    QStringList dataBitsList;
    QStringList stopBitsList;

    baudList << "4800" << "9600" << "19200" << "115200" << "128000" << "256000";     //设置波特率
    ui->BoxBaudRate->addItems(baudList);
    ui->BoxBaudRate->setCurrentIndex(0);

    parityList << "No";        //设置奇偶校验位
    ui->BoxParity->addItems(parityList);
    ui->BoxParity->setCurrentIndex(0);

    dataBitsList << "8";       //设置数据位
    ui->BoxDataBit->addItems(dataBitsList);
    ui->BoxDataBit->setCurrentIndex(0);

    stopBitsList << "1";      //设置停止位
    ui->BoxStopBit->addItems(stopBitsList);
    ui->BoxStopBit->setCurrentIndex(0);
}
 

main.cpp代码如下(示例):

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.setWindowTitle("串口调试助手");
    w.show();
    return a.exec();
}

四、实验结果

在这里插入图片描述
首先端口选中51单片机的端口,这里我设置的波特率是4800,当我们在信息发送窗口输入文字,点击发送信息按钮,51单片机收到信息返回给电脑,电脑再出现显示再信息接收窗口。

总结

提示:这里面有些代码写的不是很好。而且使用stm32调试也有bug。如果大家有更好的写法,欢迎和我一起交流。
最后记录一下编写中遇到的错误:QIODevice::write: device not open;
解决办法:

  1. 检查硬件连接是否出现问题
  2. 检查代码中的逻辑,例如 serial->open(QIODevice::ReadWrite) 打开成功会返回true,所以编写时使用if(serial->open(QIODevice::ReadWrite))逻辑来控制。更加容易发现问题。
串口调试助手是一种用于进行串口通信测试和调试的工具。基于Qt编写串口调试助手源码是一份使用Qt库进行开发的源代码,用于构建该工具的界面和实现各种串口通信功能。 Qt是一种流行的跨平台应用程序开发框架,具有丰富的界面控件和功能库,方便开发者快速构建可视化应用程序。 串口调试助手通常具有以下功能: 1. 检测可用串口:通过Qt的串口通信类,源码会扫描系统中所有可用的串口并显示在界面上供用户选择。 2. 设置串口参数:用户可以通过界面设置串口的波特率、数据位、校验位、停止位等参数,以确保与目标设备通信时设置一致。 3. 串口数据收发:用户可以在界面中输入要发送的数据并通过点击发送按钮将其发送给目标设备。同时,源码还负责接收目标设备发送的数据并在界面中显示。 4. 数据解析与显示:源码会实现数据的解析和显示功能,根据用户设定的解析规则将接收到的数据进行解析,并以可读的形式展示在界面上,帮助用户进行调试和分析。 5. 日志记录与保存:源码会支持数据的日志记录和保存功能,用户可以选择保存收发的数据记录,以方便后续分析。 6. 界面友好:通过Qt的界面设计工具和丰富的界面控件,源码会提供一个直观、易用的用户界面,方便用户进行操作和交互。 基于Qt编写串口调试助手源码可以帮助开发者快速搭建串口通信测试环境,并提供丰富的功能以满足开发和调试需求。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值