【从零入门Qt】开发一款属于自己的串口调试助手

暑假来深圳这边实习,做的是嵌入式方向,负责人分配给我的第一个任务是用Qt写一个串口调试助手。这个任务总体来讲难度适中,尽管我没接触过Qt,但能查到很多很多的资料,甚至包括别人写好的源代码,所以有很多的学习资源。

我第一天在同学的推荐下,看了一个入门的文档,《Qt 学习之路 2》,其中内容讲的比较基础,基本可以理解,算是能对Qt的语法了解个大概。而且如果实在不懂,也可以参看b站上的视频教程,是黑马程序员的教程,视频内容比较冗长,但对于初学者来说可能更好理解,各取所需,看个人选择。

因为负责人只给了我三天的时间,所以我也就花了一天左右的时间看教程,就开始看我在网上看的一份源码了。当时我的进度是黑马程序员看了不到10个视频,《Qt 学习之路 2》看了不到20节教程,虽然说看了不少,但我当时还是很慌的,对于我这种小白来说,还是不知道源代码是什么意思,但这个时候我能大概明白每个函数要做什么功能了,也就是我看懂了函数名,但函数里的句子我看不懂。

然后我就选择了按照这份代码自己复刻一份,算是尝试着自己写一下。

于是我新建了一个project,名字是Myserialport,发现源代码中main.cpp完全一样,也就是一个窗体的显示功能,很好理解,直接略去~

上面的mainwindow.h文件里面有很多库函数的引用,函数的声明,我姑且认为不重要,暂时略去

而代码最多的就集中在mainwindow.cpp文件里了,也是我最需要解决的部分!

这是我新建工程后的代码:

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

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

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

而源代码在MainWindow::MainWindow(QWidget *parent)中添加了很多窗体生成的初始化语句

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    textstate_receive = false;                 //初始化发送窗口状态为文本模式
    textstate_send = false;                    //初始化接收窗口状态为文本模式
    serialport = new QSerialPort;              //创建QSerialPort类,需要在头文件中添加#include <QSerialPort>
    ui->send_button->setEnabled(false);        //初始化接收按钮不可用
    ui->close_port->setEnabled(false);         //初始化接收按钮不可用
    ui->Receive_text_window->setReadOnly(true);//讲接收窗口设置为只读窗口
    setWindowTitle("串口调试助手");              //设置程序的标题
    setWindowIcon(QIcon(":/images/exe.jpg"));  //设置程序左上角图标
    find_port();                               //查找可用串口函数
}

以上语句还是比较好理解的,每句话我都进行了注释。

下面的代码就是定义各个函数,而.h文件里的很多函数声明也就很好理解了,也就是在.h文件里定义一下各个函数

比如以下很重要的两个函数,用于实现数据的发送和接收

//发送数据
void MainWindow::on_send_button_clicked()
{
    if(textstate_send == false)  //文本模式
    {
        serialport->write(ui->Send_text_window->toPlainText().toUtf8());
    }

    if(textstate_send == true)     //hex模式
    {
        QString str = ui->Send_text_window->toPlainText();
        int num = str.toInt();
        str = str.setNum(num,16);
        ui->Send_text_window->clear();
        ui->Send_text_window->append(str);
        serialport->write(ui->Send_text_window->toPlainText().toLatin1());
    }
}
//窗口显示串口传来的数据
void MainWindow::Read_Data()
{
    QByteArray buf;
    buf = serialport->readAll();
    if(!buf.isEmpty())          //将数据显示到文本串口
    {

        if(textstate_receive == false)   //文本模式
        {
            QString str = ui->Receive_text_window->toPlainText();
            str += tr(buf);
            ui->Receive_text_window->clear();
            ui->Receive_text_window->append(str);
        }
        if(textstate_receive == true)   //hex模式
        {
            QString str = ui->Receive_text_window->toPlainText();
            // byteArray 转 16进制
            QByteArray temp = buf.toHex().toUpper();
            str += tr(temp);
            ui->Receive_text_window->clear();
            ui->Receive_text_window->append(str);
        }
    }
    buf.clear();    //清空缓存区
}

最后实现了以下的界面,以及文本模式和串口模式两种模式转换的数据收发

p.s.:尝试了很久想要解决中文无法显示的问题,最终无果…

在这里插入图片描述

有需要的话可以在这个链接下载嗷~

个人博客欢迎关注,www.qianhongbo.top

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值