Qt如何快速的开发一款界面简洁的串口调试助手

标题:Qt如何快速的开发一款界面简洁的串口调试助手,打包可执行程序


话不多说,先上截图吧!!!
串口调试助手效果图
接下来讲教大家怎么制作一款自己的串口助手,分为以下几个步骤:

  1. 界面设计
  2. 串口搜索以及打开串口
  3. 发送数据(包含进制接收发)
  4. 接收串口发来的数据
  5. 设置标题栏的图标
  6. 设置可执行程序的桌面图标
  7. 打包可执行程序(可发送给其他好友,无需安装环境)

一、首先创建一个空的项目

List item
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、在Ui界面设置自己的专属界面

  1. 可在开始菜单找到Qt文件夹,选择Designer,这是一个可视化的界面,设计界面的话用这个比较舒服,不需要等待编译时间,如果在Qt主界面运行看效果那可太浪费时间了。
  2. 设计界面小技巧:把界面分成几块区域,用widget控件分开,然后再在里面添加控件。
  3. 预览界面快捷键:ctrl+r
    在这里插入图片描述
    打开界面如下
    在这里插入图片描述

三、设计控件的风格

点击所需要设计的控件,在属性界面找到styleSheet,点击…即可进入快捷设计界面
在这里插入图片描述
在这里插入图片描述

QPushButton{
	background-color: rgb(170, 170, 255);
	color: white;
	border-radius: 10px;  
	border: 2px groove gray;
	border-style: outset;
}

四、编写我们的代码

  1. 在我们的Ui界面,串口配置无需操作,接下来我们来自动获取电脑的串口信息并自动添加到列表里。
    在这里插入图片描述
  2. 选中查询串口按钮,右击选中转到槽,这里槽函数的功能是,当你点击这个按钮将做什么事情。
    在这里插入图片描述
  3. 在.pro文件中添加设置
QT        += serialport  #加入串口模块

实现代码:

//搜索串口
void MainWindow::on_Serach_Button_clicked()
{
    // 清除当前显示的端口号
    ui->Serial_engine_comboBox->clear();
    //检索端口号
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        ui->Serial_engine_comboBox->addItem(info.portName());
    }
}

3.打开串口

  //打开串口
void MainWindow::on_open_Button_clicked()
{
    if(ui->open_Button->text() == QString("OpenPort"))  //串口未打开
    {
        //设置端口号
        Serial.setPortName(ui->Serial_engine_comboBox->currentText());
        //设置波特率
        Serial.setBaudRate(ui->Speed_comboBox->currentText().toInt());
        //设置数据位
        switch (ui->Data_bits_comboBox->currentText().toInt())
        {
        	case 8: Serial.setDataBits(QSerialPort::Data8); break;
	        case 7: Serial.setDataBits(QSerialPort::Data7); break;
	        case 6: Serial.setDataBits(QSerialPort::Data6); break;
	        case 5: Serial.setDataBits(QSerialPort::Data5); break;
	        default: break;
        }
        //设置停止位
        switch (ui->Stop_bits_comboBox->currentText().toInt())
        {
	        case 1: Serial.setStopBits(QSerialPort::OneStop);break;
	        case 2: Serial.setStopBits(QSerialPort::TwoStop);break;
	        case 3: Serial.setStopBits(QSerialPort::OneAndHalfStop);break;
	        default:break;
        }
        //设置校验方式
        switch (ui->Parity_comboBox->currentIndex())
        {
	        case 0: Serial.setParity(QSerialPort::NoParity);break;
	        default:break;
        }
        //设置流控制模式
        Serial.setFlowControl(QSerialPort::NoFlowControl);
        //打开串口
        if(Serial.open(QIODevice::ReadWrite)==false)
        {
            QMessageBox::warning(NULL , "提示", "串口打开失败!");
            return;
        }
        // 使能串口设置控件
        ui->Serial_engine_comboBox->setEnabled(false);
        ui->Speed_comboBox->setEnabled(false);
        ui->Data_bits_comboBox->setEnabled(false);
        ui->Stop_bits_comboBox->setEnabled(false);
        ui->Parity_comboBox->setEnabled(false);
        ui->Flow_control_comboBox->setEnabled(false);
        ui->Serach_Button->setEnabled(false);
        //调整串口控制按钮的文字提示
        ui->open_Button->setText(QString("ClosePort"));
    }
    else       //串口已经打开
    {
        Serial.close();
        // 使能串口设置控件
        ui->Serial_engine_comboBox->setEnabled(true);
        ui->Speed_comboBox->setEnabled(true);
        ui->Data_bits_comboBox->setEnabled(true);
        ui->Stop_bits_comboBox->setEnabled(true);
        ui->Parity_comboBox->setEnabled(true);
        ui->Flow_control_comboBox->setEnabled(true);
        ui->Serach_Button->setEnabled(true);
        //调整串口控制按钮的文字提示
        ui->open_Button->setText(QString("OpenPort"));
    }
}

4.串口发送

//串口发送
void MainWindow::on_Send_Four_pushButton_clicked()
{
    if(Serial.isOpen()==false)  //判断串口是否打开
    {
        QMessageBox::warning(NULL , "提示", "请打开串口!");
        return;
    }
    //toPlainText() 转换为纯文本格式
    //toUtf8() 转换为UTF-8 编码
    QByteArray senddata = ui->SendEdit_Four->toPlainText().toUtf8();

    //判断是否有非16进制字符
    if(ui->hex_radioButton_four->isChecked()==true) //勾选了16进制发送
    {
        int cnt = senddata.size();          //计算要发送数据的长度
        char *data = senddata.data();
        for(int i=0;i<cnt;i++)//判断是否有非16进制字符
        {
            if(data[i]>='0' && (data[i]<='9'))
                continue;
            else if(data[i]>='a' && (data[i]<='f'))
                continue;
            else if(data[i]>='A' && (data[i]<='F'))
                continue;
            else if(data[i] == ' ')     //是否有空格
                continue;
            else
            {
                QMessageBox::warning(NULL , "提示", "输入非16进制字符!");
                return;
            }
        }
        senddata = senddata.fromHex(senddata);
    }
    //勾选了发送新行,意思是在发送数据之后加上一个回车换行符
    if(ui->New_checkBox_four->isChecked()==true)
    {
        int cnt = senddata.size();
        senddata = senddata.insert(cnt,"\r\n"); 
    }
    Serial.write(senddata); //通过串口发送数据
}

5.串口接收数据
这里需要把串口读取函数定义在private slots:里

private slots:
    void on_open_Button_clicked();
    void on_Serach_Button_clicked();
    void on_Send_Four_pushButton_clicked();
    void Serial_read();//串口读取
    void on_Clearn_Button_clicked();
void MainWindow::Serial_read()
{
    //读取串口收到的数据
    QByteArray buffer = Serial.readAll();
    //判断是否需要16进制显示
    if(ui->hex_radioButton_read->isChecked()==true)
    {
        buffer = buffer.toHex() ;//转换为16进制 例:"1234" -->“31323334”
    }
    QString receive = QString(buffer);
    //在接收窗口显示收到的数据
    ui->Receive_Edit->insertPlainText(receive);
}

并设置它的一个槽函数:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowIcon(QIcon("://images/myico.png")); //设置启动左上角图标

    ui->Speed_comboBox->setCurrentIndex(5);                    //波特率默认9600
    ui->Data_bits_comboBox->setCurrentIndex(3);               //数据位默认8
    ui->Stop_bits_comboBox->setCurrentIndex(0);               //停止位默认1
    ui->Parity_comboBox->setCurrentIndex(0);                    //校验位默认0
    ui->Flow_control_comboBox->setCurrentIndex(0);         //流控制默认 NoFlowControl
    
	//连接槽函数
    connect(&Serial,&QSerialPort::readyRead,this,&MainWindow::Serial_read);
}

6.清屏

//清空接收窗口
void MainWindow::on_Clearn_Button_clicked()
{
    ui->Receive_Edit->clear();
}

7.其他一些小功能还没完善,比如说计算收到多少个字节,发送了多少个字节,清除接收发送的字节数,而发送这里也只实现了最下面的一个,其他三个没实现,读者可自行实现。

五、如何设置标题栏图标

  1. 右击工程,添加新文件
    在这里插入图片描述
  2. 定义名称
    在这里插入图片描述
  3. 添加资源
    在这里插入图片描述
  4. 代码实现
this->setWindowIcon(QIcon("://images/myico.png")); //设置启动左上角图标
  1. 效果图
    在这里插入图片描述

六、如何制作可执行程序的桌面图标

  1. 先看效果图吧,上面的是设置好的,而下面的是自带的
    在这里插入图片描述
  2. 在工程目录下,添加两个文件
    第一个是图标:必须是.ico结尾的照片,可在网站上自行转换,这里贴一个转换网站
    https://www.aconvert.com/cn/icon/png-to-ico/
    转换几秒钟的事,转换完把图片保存到工程目录下
    在这里插入图片描述
    第二个是编写.rc后缀的文件,用notepad++打开,复制以下代码,名字是图片的名字
    在这里插入图片描述
IDI_ICON1 ICON  DISCARDABLE "myico.ico"
  1. 然后最后一步是在Qt工程中的.pro文件加上一句话,名字也是和文件一样的名字
    在这里插入图片描述
RC_FILE += myico.rc
  1. 运行即可看到图标制作完成

七、如何打包可执行程序

  1. 选择编译器
    在这里插入图片描述

  2. 将构建好的可执行程序复制到桌面并创建一个空的文件夹放里面
    在这里插入图片描述
    在这里插入图片描述

  3. 打开Qt自带的终端
    在这里插入图片描述

  4. 切换刚才复制的可执行程序所在的文件夹,并执行一下代码

cd /d C:\Users\Unicorn\Desktop\new   //   /d:切换盘符所需要添加
windeployqt serialport.exe           //可执行程序的名字.exe
  1. 等待打包
    在这里插入图片描述
  2. 打包完成可在刚才新建的文件夹下看到生成的一大堆东西,然后就可以压缩打包发送给其他小伙伴炫耀了,哈哈哈哈
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值