QT学习—串口LED小项目

news2024/11/16 21:45:05

前言——博主刚开始接触QT,本文参考博主嵌入式大杂烩的一篇博文易懂 | 手把手教你编写你的第一个上位机,初步学习一下QT开发。

文章目录

  • 一、QT安装
  • 二、新建工程
  • 三、创建上位机界面
    • 3.1 修改控件名
    • 3.2 添加槽函数
  • 四、上位机程序打包
  • 五、上位机测试
  • 六、总结
    • 6.1 设置上位机窗口名称
    • 6.2 设置上位机图标
    • 6.3 使用QMessageBox提示框
    • 6.4 Debug输出

一、QT安装

关于QT安装的一些细节这里就不再赘述了,已经有好多大佬介绍,我也是从那些介绍学习安装的QT。但是在下载时发现,下载速度极慢。参考了博主Loken2020的一个安装教程,说需要用命令行启动安装,切换成中科大的源,可以加快下载速度。但是本人在尝试时,发现博主给出的指令有点小问题(不排除是我自身原因)。这里再介绍一下。

我的qt-unified-windows-x86-4.2.0-online.exe文件放在E盘的QT文件夹下,win + R打开命令行窗口,输入下面的指令,可以切换成中科大的源进行下载

E:\QT\qt-unified-windows-x86-4.2.0-online.exe --mirror https://mirrors.ustc.edu.cn/qtproject

实测速度快很超级多。博主使用的是手机热点下载,最快能到5M多。

QT安装

二、新建工程

由于博主是刚接触QT,关于新建工程这里也不过多的赘述,只是介绍和一下自己遇到的问题。新建完工程后发现自己的页面和教程不同。自己的页面没有分类文件夹。

没有文件夹分类

点击漏斗形状的图标,取消勾选“简化树形图”,就恢复正常了。

有文件夹分类

三、创建上位机界面

按照参考的博文,创建好了上位机界面

上位机界面

3.1 修改控件名

创建完上位机界面之后,需要修改我们用到的这些控件的名字。方便我们在后续编写程序时,能够快速的明白每一个控件的作用。

博主最开始修改控件名字的方式有问题,导致看似修改成功,但实际并没有修改成功。在后续编写槽函数时无法找到控件,程序编译报错。

博主最开始是在右侧修改的控件名称

修改控件名称

虽然修改完成后,在这个页面显示的名称也已经被修改。但是在后续编写完槽函数后,点击按钮,并不会执行对应的槽函数。此时选中控件,右键,选择“改变对象名称”发现,实际这里的控件名称并未被修改。

改变对象i你改成

但是在使用右键,选择“改变对象名称”的方法修改控件名称时,右侧的名称也会随之变化。因此,在修改控件名称时,用右键,选择“改变对象名称”的方法才是正规的。

3.2 添加槽函数

槽函数就是在按下某个按键或者有其他信号时,该信号对应的需要执行的内容。这里有四个按键,需要添加四个槽函数。添加的方法是,直接右键控件,选择“转到槽”。这样就可以直接编写槽函数,而且槽函数与信号自动关联,不需要我们再手动关联。

编写槽函数

打开串口按钮的槽函数如下

void MainWindow::on_openButton_clicked()
{
    // 串口设置
    serialPort->setPortName(ui->serialBox->currentText());   // 串口几
    serialPort->setBaudRate(ui->baudrateBox->currentText().toInt());   // 波特率
    serialPort->setDataBits(QSerialPort::Data8);   // 8位
    serialPort->setStopBits(QSerialPort::OneStop);   // 一位停止位
    serialPort->setParity(QSerialPort::NoParity);   // 无校验

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

关闭串口和开关LED按钮的槽函数如下

void MainWindow::on_closeButton_clicked()
{
    // 关闭串口
    serialPort->close();
}


void MainWindow::on_openButton_2_clicked()
{
    // 串口发送“ON”
    serialPort->write("ON\n");
}


void MainWindow::on_offButton_clicked()
{
    // 串口发送“OFF”
    serialPort->write("OFF\n");
}

值得注意的是,利用这种方法添加槽函数时,会有警告。

槽函数警告

这是因为我们使用上面的方法添加槽函数时,如果有一天我们修改了控件的名称。编译器不会报错,也可以继续运行。但是由于控件名称和槽函数无法对应,槽函数就失效了。其实这个警告并不影响我们这么操作,只是在后续修改控件名称时注意就好啦。

四、上位机程序打包

在打包上位机程序时,按照参考博主文章的介绍,并未遇到什么问题。但是上位机的图标要求的格式时.ico格式。这里推荐一个在线将图片转换成.ico格式的网站https://convertio.co/zh/png-ico/。最终,博主打包出来的上位机如下

打包出来的上位机

五、上位机测试

该上位机的主要功能是,通过串口控制LED的亮灭。关于串口通信的介绍,可以见博主STM32速成笔记系列串口通信篇。串口接收中断函数和解析函数如下

*==============================================================================
 *函数名称:USART1_IRQHandler
 *函数功能:USART1中断服务函数
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
u32 gReceCount = 0;   // 接收计数变量
u32 gClearCount = 0;   // 清空接收数组计数变量
u8 gReceFifo[1500];   // 接收数组
u8 gReceEndFlag = 0;   // 接收完成标志位 

void USART1_IRQHandler(void)  
{
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)   //接收到一个字节  
	{
		gReceFifo[gReceCount++] = USART_ReceiveData(USART1);
	}
	else if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET)   //接收到一帧数据
	{
		USART1->SR;   // 先读SR
		USART1->DR;   // 再读DR
		
		gReceEndFlag = 1;   // 接收完成标志置1 
	} 
}
/*
 *==============================================================================
 *函数名称:Uart_Rece_Pares
 *函数功能:解析串口接收内容
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Uart_Rece_Pares(void)   // 串口接收内容解析函数
{
	if (gReceEndFlag  == 1)   // 如果接收完成
	{
		// 解析接收内容
		if (gReceFifo[1] == 'N')
		{
			Med_Led_StateCtrl (LED1,LED_ON);   // 点亮LED1
		}
		
		if (gReceFifo[1] == 'F' && gReceFifo[2] == 'F')
		{
			Med_Led_StateCtrl (LED1,LED_OFF);   // 熄灭LED1
		}
		
		// 清空接收数组
		for (gClearCount = 0;gClearCount < gReceCount;gClearCount ++)
		{
			gReceFifo[gClearCount] = ' ';
		}
			
		gReceEndFlag = 0;   // 清除接收完成标志位
		gReceCount = 0;   // 清零接收计数变量
	}
}

六、总结

最后,简单总结一下这个小项目中的其他收获。

6.1 设置上位机窗口名称

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

    // 设置窗口名称
    this->setWindowTitle("串口LED助手");
}

6.2 设置上位机图标

在.pro文件中添加

# 图标
RC_ICONS = led.ico

设置上位机图标

6.3 使用QMessageBox提示框

使用QMessageBox提示框,需要添加下面的头文件

#include <QMessageBox>   // 使用QMessageBox提示框

6.4 Debug输出

在利用Debug调试时,可以在调试窗口输出信息,程序如下

    // Debug输出
    qDebug("Ready!\n");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/728681.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

不要用 in + 子查询

前两天我的 VIP 用户向我抛出了一个 SQL 问题&#xff0c;他的 MySQL 是 8.x版本&#xff1a; 大概意思如下 sql &#xff1a; select * from A where id in (select max(id) as id from A where task_id in(1,2,3) group by task_id );这个 A 表中是有 task_id 这个索引的。 …

【转换】编码转换工具笔记

应用场景 应用场景是程序整合第三方库多平台运行&#xff0c;第三方库window平台编译&#xff0c;代码移植到linux出现bom问题 思考解决 windows使用utf-8编码&#xff0c;linux使用utf-8无bom编码 工具主要针对utf-8编码文件&#xff0c;能够批量添加删除BOM&#xff0c;无…

SpringBoot获取项目日志

目的 对于布署在远端的服务&#xff0c;我们想快速的获取到日志。对于使用了日志服务&#xff0c;也可能因为上报间隔太长&#xff0c;日志不够实时。 所以想通过一些方式&#xff0c;可以不用进入到容器内也可以简单快速获取到日志&#xff0c;而且是实时的日志。目标就是获…

c语言进阶-动态内存管理

重点学习内容 动态内存管理四大函数 Malloc 内存申请函数 返回值是无类型的指针&#xff0c;指向分配的内存的首地址。申请失败会返回空指针。 malloc返回值是void*类型&#xff0c;使用时需要强制转换成所需类型。 malloc和free匹配使用&#xff0c;但是如果不free释放内存&…

解析3D视觉系统在引导金属件上下料中的应用

原创 | 文 BFT机器人 引言 Introduction 机器视觉技术作为一种高科技的智能化技术&#xff0c;正在工业生产领域发挥着越来越重要的作用。它利用计算机视觉技术&#xff0c;通过获取、处理和分析图像&#xff0c;实现对产品和工艺过程的监测、检测和控制。 随着人工智能技术的…

[SUCTF2019]hardcpp

前言 又遇到ollvm了 解混淆 可以直接用angr运行脚本去除除控制流平坦化&#xff0c;最好在ancoda等管理环境里面安装angr不然问题很多 https://github.com/Pure-T/deflat 去除前 去除后&#xff0c;它将多余的直接nop了 分析 主要加密区域位于匿名函数这一块&#xff0c…

前端学习——Web API(Day1)

Web API基本认知 Web API 基本认知 作用和分类 DOM DOM树 DOM对象 获取DOM对象 根据CSS选择器来获取DOM元素 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" …

【教学类-36-08】转学“纪念册“留念(生肖用midjounery-niji)

作品样式 背景需求&#xff1a; 即将离开班级&#xff0c;我想收集一份28个孩子的绘画册做——留念转学纪念册. 材料准备&#xff1a; 幼儿照片 ——3月初到中6班拍摄的幼儿手持学号名字纸的照片&#xff08;为了背诵幼儿信息而拍摄的照片&#xff0c;统一竖版&#xff09; 生…

jmeter 连接数据库常见报错

1. 不允许主机连接到MySQL 报错信息&#xff1a; Response message:java.sql.SQLException: Cannot create PoolableConnectionFactory (null, message from server: "Host 192.168.1.6 is not allowed to connect to this MySQL server") 说明&#xff1a;本机的地…

代码随想录day10

232. 用栈实现队列 思路&#xff1a;用两个list去模拟栈的操作&#xff0c;一个入栈list&#xff0c;一个出栈list. 并且了解栈的操作&#xff0c;pop,peek,push. 代码&#xff1a; def __init__(self):self.stack1 [] #入栈self.stack2[] #出栈def push(self, x: int) ->…

【Linux】常用网络命令:ping\netstat\mount\ifconfig

ping命令用于检测主机&#xff0c;执行ping命令指令会使用ICMP传输协议&#xff0c;发出请求回应的信息&#xff0c;若远程主机的网络功能没有问题&#xff0c;就会回应该信息。   netstat命令用于显示网络状态&#xff0c;利用netstat 指令可让你得知linux系统的网络情况。…

图像 跟踪 - MOTR: End-to-End Multiple-Object Tracking with Transformer (ECCV 2022)

MOTR: End-to-End Multiple-Object Tracking with Transformer - 使用Transformer进行端到端多目标跟踪&#xff08;ECCV 2022&#xff09; 摘要1. 引言2. 相关工作3. 方法3.1 目标检测中的查询3.2 检测查询和跟踪查询3.3 Tracklet-Aware标签分配3.4 MOTR架构3.5 查询交互模块3…

git-创建文件夹方式管理分支

文章目录 前言一、效果图二、git命令总结 前言 下面介绍一个git创建文件夹的方式管理分支的方法&#xff0c;在sourcetree上显示目录样式&#xff0c;好对每个版本做管理&#xff0c;可以更方便追踪历史版本代码。 一、效果图 1、git文件夹方式管理分支 二、git命令 1、在本…

SSMP整合案例(14) 将界面查询改为分页查询

前面几篇文章过后 我们的项目基本环境就算搭好了 但是 我们下面的分页显然就是个摆设 这里 我们就先将查询的方法改成分页的 我们 java项目之前做了这个分页的函数 那么 我们vue项目 直接在 src下的 api 下的bookApi.js中加上对应的函数 export function getPage(params){r…

动态SLAM论文(8) — DynaSLAM II: Tightly-Coupled Multi-Object Tracking and SLAM

目录 1 Introduction 2 Related Work 3 Method A. 符号表示 B. 物体数据关联 C. 以对象为中心的表示 D. 对象束调整 E. 边界框 4 Experiments A. 视觉里程计 B. 多目标跟踪 C. 时间分析 5 结论和未来工作 摘要 —— 在视觉SLAM算法中&#xff0c;假设场景是刚性的是…

快速入门uniapp——从环境搭建到项目实践

&#x1f642;博主&#xff1a;小猫娃来啦 &#x1f642;文章核心&#xff1a;快速入门uniapp——从环境搭建到项目实践 文章目录 初步介绍UniApp开发环境搭建下载和安装UniApp开发工具创建新项目&#xff08;HBuilderX&#xff09;开发工具界面介绍 UniApp基础知识页面结构页面…

Rdkit|SMARTS语言应用

github&#xff1a;地址 文章目录 Rdkit|SMARTS语言应用子结构搜索HasSubstructMatch(patt)得到子结构序列GetSubstructMatch删除子结构AllChem.DeleteSubstructs(m,patt)取代基替换AllChem.ReplaceSubstructs(m, patt, rep)显示核心结构显示侧链结构 Chem.ReplaceCore分子拆分…

vue transition标签用法

transition标签 是Vue的内置动画标签&#xff0c;在插入/更新/移除DOM元素时&#xff0c;在合适的时候给元素添加样式类名&#xff08;配合css样式使用&#xff0c;实现动画效果&#xff09; 注意&#xff1a; 1.transition标签只能包含一个元素&#xff1b;如果里面写了多个…

如何从零开始学习自动化测试?终于找到靠谱的教程了

目录 前言 测试基础 Python基础 selenium appium requests unittest 项目实战&#xff1a; 总结&#xff1a; 前言 最近有几个小伙伴在后台给安静私信说&#xff0c;如何学习自动化&#xff0c;不知道如何入手&#xff1f;在网上看的资料都是乱七八糟的&#xff0c;每…

接口返回慢 图片加载失败问题

该图片是通过后端接口返回picUrl来给img的src赋值 但是后端接口响应较慢 导致html加载完 data也没赋到值 图片加载裂开 解决办法&#xff1a;img标签添加error事件获取错误信息回调 <img v-if"certificateUrl" :src"certificateUrl" class"certif…