QT C++入门学习(2) QT Creator写一个简单的上位机控制LED

news2025/2/9 4:14:09

上位机和下位机的概念

上位机:指的是可以直接发送操作指令的计算机或者单片机,一般提供用户操作交互界面并向用户展示反馈数据。

典型设备:电脑、平板、手机、面板、触摸屏

下位机:指的是与机器相连接的计算机或者单片机,一般用于接收和反馈上位机的指令,并根据指令控制机器执行动作以及从机器传感器读取数据。

典型设备:PLC、stm32、51、FPGA、ARM等各类可编程芯片。

上位机软件:用于完成上位机操作交互的软件

  • 上位机给下位机发送控制命令,下位机接收到此命令并执行相应的动作;
  • 上位机给下位机发送状态获取命令,下位机接收到此命令后调用传感器测量,然后够转化为数字信息反馈给上位机。
  • 下位机主动发送状态信息或者报警信息给上位机

为了实现以上过程,上位机和下位机都需要独立进行编程,都需要专门的开发人员在各自的平台上编写代码。

上位机和下位机之间进行通信,常见的是有线连接,比如485,串口,USB等等,当然利用无线连接也可以,上位机和下位机的关系也有点类似主机和从机,通常上位机是电脑或平板,下位机是单片机设备。

编写程序

开发环境的搭建参考以往的文章:QT C++入门学习(1) QT Creator安装和使用

这里我们选择串口作为电脑端上位机软件与下位机的通信方式,串口作为嵌入式领域最常用的通信方式被广泛使用。

通信协议我们定义:AT+LED=ON\r\n 和 AT+LED=OFF\r\n 分别是开灯和关灯(\r\n是回车换行符,用来指示命令结尾)

1、新建一个serial_led工程
在这里插入图片描述
更改名称:
在这里插入图片描述
基类选择QWidget:
在这里插入图片描述
后面都是默认点下一步即可。
创建项目有疑问可以查看https://blog.csdn.net/weixin_44788542/article/details/130413466

完成后项目文件结构默认如下:
在这里插入图片描述
2、上位机界面设计
Qt 有一个可视化的界面设计工具:Qt 设计器(Qt Designer)。我们双击widget.ui文件就可以进入Qt Designer,在Qt Designer中我们可以通过拖动控件的方式来设计我们的界面
分别添加两个Label,两个Combo Box,和四个PushButton控件布局成如下图所示:
在这里插入图片描述
选中所有控件,点击栅格布局,已经放置的控件就自动对齐了。
在这里插入图片描述
默认的界面太大了,拉小一点:
在这里插入图片描述
3、完善控件参数
双击波特率对应的Combo Box,点击加号新增两个常用的波特率9600和115200备选项
在这里插入图片描述
选中控件,然后在右下角的对象名称属性那里更改名称
在这里插入图片描述
逐一按下图更改对象名称:
在这里插入图片描述
4、编写程序:
打开serial_led.pro文件,在第一行添加serialport
在这里插入图片描述

QT       += core gui serialport

widget.h文件编写

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSerialPort>
#include <QSerialPortInfo>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Widget *ui;
    QSerialPort *serialPort;//定义串口指针
private slots:

    /*以下为widget.ui文件中点击“转到槽”自动生成的函数*/
    void on_openBt_clicked();

    void on_btnSerialCheck_clicked();

    void on_btnLedOn_clicked();

    void on_btnLedOff_clicked();

};
#endif // WIDGET_H

widget.cpp文件编写

#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>

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

    QStringList serialNamePort;

    serialPort = new QSerialPort(this);

    ui->serailCb->clear();
    //通过QSerialPortInfo查找可用串口
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        ui->serailCb->addItem(info.portName());
    }

}

//检测通讯端口槽函数
void Widget::on_btnSerialCheck_clicked()
{
    ui->serailCb->clear();
    //通过QSerialPortInfo查找可用串口
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        ui->serailCb->addItem(info.portName());
    }
}

/*打开串口*/
void Widget::on_openBt_clicked()
{

    // 初始化串口属性,设置 端口号、波特率、数据位、停止位、奇偶校验位数
    serialPort->setPortName(ui->serailCb->currentText());
    serialPort->setBaudRate(ui->baundrateCb->currentText().toInt());
    serialPort->setDataBits(QSerialPort::Data8);
    serialPort->setStopBits(QSerialPort::OneStop);
    serialPort->setParity(QSerialPort::NoParity);

    // 根据初始化好的串口属性,打开串口
    // 如果打开成功,反转打开按钮显示和功能。打开失败,无变化,并且弹出错误对话框。
    if(ui->openBt->text() == "打开串口"){
        if(serialPort->open(QIODevice::ReadWrite) == true){
            ui->openBt->setText("关闭串口");
            // 让端口号下拉框不可选,避免误操作(选择功能不可用,控件背景为灰色)
            ui->serailCb->setEnabled(false);
        }else{
            QMessageBox::critical(this, "错误提示", "串口打开失败!!!\r\n该串口可能被占用\r\n请选择正确的串口");
        }
    }else{
        serialPort->close();
        ui->openBt->setText("打开串口");
        // 端口号下拉框恢复可选,避免误操作
        ui->serailCb->setEnabled(true);
    }

}

void Widget::on_btnLedOn_clicked()
{
    serialPort->write("AT+LED=ON\r\n");
}

void Widget::on_btnLedOff_clicked()
{
    serialPort->write("AT+LED=OFF\r\n");
}

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

main.cpp不需要改动。

5、添加上位机图标
在网上找一个相关的.ico后缀的图标下载放到我们的工程路径下,如:
在这里插入图片描述
免费的ico文件下载参考该文:https://zhuanlan.zhihu.com/p/431105940
推荐https://www.iconfinder.com/

然后在我们的serial_led.pro文件中添加如下一行代码:

RC_ICONS = serial_led.ico

注意后面的文件名就是放在工程目录下的ico文件名
在这里插入图片描述
点击三角符号运行程序
在这里插入图片描述
界面左上角的图标就是我们放入的ico图标
在这里插入图片描述
这个图标还将作为打包生成的exe文件的图标。

后续打包的过程在另一文章有介绍,这里不赘述。传送门:QT如何打包生成独立可执行.exe文件、

测试验证

实际工作中,我们自己开发好上位机,需要等下位机弄好后与之联调测试,如果下位机未准备好,我们可以自己先尽可能自测。
比如我这里用了两个USB转串口模块,两个模块的GND连接,TX和RX连接,两个模块都连接到电脑上,然后打开我们开发的上位机,选择其中一个端口进行连接,对于另一个模块,我们用常用的串口助手连接。这样我们点击开灯和关灯的按钮,正常会在另一个串口助手上收到相应的指令。
只要上位机这块的功能无误,下位机再按照这个指令去开发功能即可。

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

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

相关文章

Studio 3T 2023.5 (macOS, Linux, Windows) - MongoDB 的专业 GUI、IDE 和 客户端

Studio 3T 2023.5 (macOS, Linux, Windows) - MongoDB 的专业 GUI、IDE 和 客户端 请访问原文链接&#xff1a;https://sysin.org/blog/studio-3t-2023/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Studio 3T&#xff0c;M…

黑客松必备|Bear Necessities Hackathon Office Hours汇总

由Moonbeam和AWS Startups联合主办的Bear Necessities Hackathon黑客松启动仪式已于5月30日举行。本次黑客松将历时约1个月的时间&#xff0c;包含6个挑战&#xff0c;分别由Moonbeam基金会、Chainlink、StellaSwap、SubQuery、Biconomy提供赞助&#xff0c;总奖池超过5万美金。…

面试软件测试时,面试官最想听到的答案是什么?

问题&#xff1a;面试软件测试时&#xff0c;面试官让你测一个软件&#xff0c;比如朋友圈&#xff0c;或者让你测试你的电脑为什么打不开网页&#xff0c;而QQ可以打开之类的&#xff0c;他最想听到的答案是什么&#xff1f; 如上所述&#xff0c;在实际面试中&#xff0c;面试…

懂点测试基础就敢要17k? 面试官:最多8K,多一分都没有...

公司前段缺人&#xff0c;也面了不少测试&#xff0c;结果竟然没有一个合适的。一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在10-25k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。看简历很多都是3年工作经验&#xff0c;但面试…

Java泛型的使用

1.什么是泛型&#xff1f; 所谓泛型&#xff0c;就是允许在定义类、接口时通过 一个标识 表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时&#xff08;例如&#xff0c;继承或实现这个接口&#xff0c;用这个类型声明变量、创建对象时&#…

5.Opencv-图像滤波(均值,方框,高斯,中值,双边滤波)

常见的图像滤波操作有&#xff1a; 均值滤波&#xff08;cv2.blur&#xff09; 方框滤波&#xff08;cv2.boxFilter&#xff09; 高斯滤波&#xff08;cv2.GaussianBlur&#xff09; 中值滤波&#xff08;cv2.medianBlur&#xff09; 双边滤波&#xff08;cv2.bilateralFilter…

电脑小白不要错过这五款小众但强大的软件

电脑上的各类软件有很多&#xff0c;除了那些常见的大众化软件&#xff0c;还有很多不为人知的小众软件&#xff0c;专注于实用功能&#xff0c;简洁干净、功能强悍。 多语言翻译——QTranslate QTranslate是一款实用的多语言翻译工具。它可以在任何应用程序中选中文本&#…

【C++】模版进阶

目录 一、非类型模版参数二、模板的特化1、概念2、函数模版特化3、类模板特化1.全特化2.偏特化3.类模板特化应用示例 三、模版分离编译1、什么是分离编译2、模板的分离编译3、模板的优缺点 一、非类型模版参数 模版参数分为类型模版参数与非类型模版参数 类型模版参数&#x…

一定要看!带你选择适合自己的测试工具

目录 前言&#xff1a; Jmeter实现接口请求JSON断言 Postman接口请求断言 前言&#xff1a; 选择适合的测试工具对于测试人员和测试项目的成功非常重要。不同的测试工具都有其独特的优缺点&#xff0c;而且每个项目的需求也不尽相同。因此&#xff0c;在选择测试工具时&#…

使用vitepress快速搭建个人网站或官方文档网站

使用vitepress快速搭建个人网站或官方文档网站 1. vitepress是什么&#xff1f; 官方首页的介绍&#xff0c; 翻译过来就是&#xff0c;vite和vue组成的强大的静态网站构造器。简单、强大和快速&#xff0c;是你一直想要的SSG(Static Site Generator)框架。 官网地址&#…

python mitmproxy抓包库

一.简介 mitmproxy是一款用Python编写的支持HTTP(S)的中间人代理工具。它可以拦截、查看、修改、重放和保存HTTP/HTTPS流量 &#xff0c;支持命令行界面和图形界面&#xff0c;可用于安全测试、网络调试、API开发和反向工程等场景。mitmproxy具有很高的灵活性和扩展性&#xf…

GUT|IF30+的联合分析文章:宏基因加代谢组

● 代谢组学是基于LC-MS/MS液质联用技术对生物样本中的小分子代谢物进行定性和相对定量分析&#xff1b; ● 宏基因组-代谢组的联合分析可以用来解释差异菌群与差异代谢物的关联性&#xff1b; ● 从而帮助建立微生物-代谢物-表型之间的逻辑关系。 凌恩生物的宏基因组学引入了…

JS:yFiles for HTML Complete 2.5.0 Crack

yFiles for HTML Complete 是市场上最先进、最完整的图表解决方案。我们强大而灵活的 API 提供了广泛的功能——开箱即用。只需选择最符合您需求的那些。 适用于每个用例的布局 从大量预定义的布局中进行选择并配置它们以完美地适应手头的任务。 yFiles 提供业内最广泛的高质量…

Sentinel与Hystix的线程隔离有什么差别

线程隔离有两种方式实现&#xff1a; 线程池隔离&#xff08;hystix 默认采用&#xff09; 优点&#xff1a;支持主动超时&#xff0c;支持异步调用 缺点&#xff1a; 线程的额外开销比较大 场景&#xff1a; 低扇出&#xff08;服务A调用服务B这种简单的调用&#xff09;信号…

新能源共享叉车充电桩管理系统设计思路

一、充电桩系统设计思路 1、总后台端&#xff0c;电脑版 1.1运营商管理。后台可以添加运营商&#xff0c;运营商可以添加无限添加充电站、充电桩、站点合伙人、充电操作员等&#xff0c;运营商、站点合伙人均有独立的后台入口&#xff0c;可以管理和查看与当前运营商相关充电站…

测试行业干了6年,从只会点点点到了现在的测试开发,总算是证明了自己

测试不止是点点点 我感觉我是一个比较有发言权的人吧&#xff0c;我在测试行业摸爬滚打6年&#xff0c;以前经常听到开发对我说&#xff0c;天天的点点点有意思没&#xff1f; 和IT圈外的同学、朋友聊起自己的工作&#xff0c;往往一说自己是测试&#xff0c;无形中也会被大家…

如何优雅的给SpringBoot部署的jar包瘦身?

一、需求背景 我们知道Spring Boot项目&#xff0c;是可以通过java -jar 包名 启动的。 那为什么Spring Boot项目可以通过上述命令启动&#xff0c;而其它普通的项目却不可以呢&#xff1f; 原因在于我们在通过以下命令打包时 mvn clean package一般的maven项目的打包命令&…

k8s kubeadm高可用集群证书续期

1.查看证书期限 kubeadm certs check-expiration 2.更改系统时间为证书过期的时间 因为要保持集群的时间一直&#xff0c;使用xshell对多个会话同时执行以下命令 systemctl stop chrondy #停止时间同步工具 date -s 06/15/2024 #更改系统时间为证书过期后的时间 date …

2023年JDK要升级到多少?看看七家大模型给的答案

前言 在2023年很多公司应该还在用JDK8&#xff0c;目前JDK已经更新到JDK20&#xff0c;JDK21也将在2023年9月发布&#xff0c;那么在2023年如果我们要升级JDK&#xff0c;到底升级到哪个版本比较合适呢&#xff1f;这个问题我们可以交给大模型&#xff0c;看看各家大模型是怎么…

使用Jemeter对HTTP接口压测

我们不应该仅仅局限于某一种工具&#xff0c;性能测试能使用的工具非常多&#xff0c;选择适合的就是最好的。笔者已经使用Loadrunner进行多年的项目性能测试实战经验&#xff0c;也算略有小成&#xff0c;任何性能测试&#xff08;如压力测试、负载测试、疲劳强度测试等&#…