当前位置: 首页 > news >正文

QT上位机开发(串口界面设计)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        如果上位机要和嵌入式设备进行打交道的话,那么串口可能就是我们遇到的第一个硬件设备。串口的物理接线很简单,基本上就是收、发、地三根线。目前大部分台式机,或者笔记本都已经没有232串口了,所以如果上位机需要和嵌入式设备进行通信的话,还需要通过usb转一下,这样才用的起来。

1、串口的应用场合

        串口的传输速率不是很快,这决定了它基本上只能进行低速数据的传输。但是就算是进行低速传输,最大速度也能达到115200bit每秒。这意味着,如果传输的仅仅是一些打印、传感器、控制数据,那也是绰绰有余了。串口的应用场景很多,串口转屏幕、串口的传感器、串口的gprs,这些都是很常见的串口设备。

2、串口之上的协议

        如果只是串口,的确没有什么难度。关键是,每一种串口设备都有自己的协议。对于上位机来说,它通常当成是主动请求方。而对下位机,也就是嵌入式模块来说,它一般是当成响应方来进行应答。两者之间的应答应该保持在一定的形式。举个例子来说,一个简单的协议应该包括这几个方面,

        1)报文头;

        2)长度;

        3)命令号;

        4)命令详细数据;

        5)校验码。

        报文头,一般用特殊的数据来表示,通常是55aa这种。长度,也就是报文的全部长度。可以用它来进行数据分割,也可以用它来计算校验码。命令号的话,根据内容的多少来设定。如果命令比较多,还有可能分成主命令和子命令。命令详细数据,这就和具体命令相关了,这里不再一一描述。最后就是校验码,为了防止数据在传输的过程中发生错误,一般需要对前面的数据做一个校验的操作。如果检验码没有问题,那么一切ok。反之,接收方一般会要求发送方重新发送数据。

3、练习串口界面设计

        网上关于串口界面设计的代码,或者是开源软件很多。大家不要认为软件比较多,就没有写的必要。正因为多,所以写起来才有很多的内容可以参考。而且,别人能写,不代表自己就可以完成相关的编写工作,这完全是两码事。

4、自己编写和设计串口界面

        串口界面一般分成两个部分,左边是设置,右边是数据显示。设置的话,分成了串口选择、波特率、数据位选择、校验位选择、停止位选择这几个部分。有了这几个参数,我们就可以打开串口了。当然对于收到的数据,我们也可以选择用ascii码显示,还是用16进制显示。

        对于数据的发送也是一样,可以通过选择ascii方式还是hex的方式,判断我们的数据应该怎么发送才对。右侧的部分一般是两个编辑框,一个是收到的数据,一个是发送的数据,在发送的数据框旁边通常包含一个发送按钮。

        最后在窗口的下半部分,还会有一些状态栏的数据,比如串口状态、收发了多少字节、版本号等等。我们在用qt实现的时候,首先需要创建一个widget工程,接下来用designer进行界面设计就可以了。因为控件的数量比较多,这里就不建议大家用cpp硬编码的形式去进行界面的绘制动作了。不管怎么说,哪怕是再简单的东西,还是要动手去练一练,遇到问题了经过思考和反馈,最后才能变成自己能够真正理解的东西。

        这是它对应的ui文件,

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>QtWidgetsApplicationClass</class><widget class="QMainWindow" name="QtWidgetsApplicationClass"><property name="geometry"><rect><x>0</x><y>0</y><width>805</width><height>527</height></rect></property><property name="windowTitle"><string>QtWidgetsApplication</string></property><widget class="QWidget" name="centralWidget"><widget class="QComboBox" name="comboBox"><property name="geometry"><rect><x>87</x><y>21</y><width>87</width><height>21</height></rect></property></widget><widget class="QComboBox" name="comboBox_2"><property name="geometry"><rect><x>86</x><y>61</y><width>87</width><height>21</height></rect></property></widget><widget class="QComboBox" name="comboBox_3"><property name="geometry"><rect><x>86</x><y>101</y><width>87</width><height>21</height></rect></property></widget><widget class="QComboBox" name="comboBox_5"><property name="geometry"><rect><x>86</x><y>185</y><width>87</width><height>21</height></rect></property></widget><widget class="QPushButton" name="pushButton"><property name="geometry"><rect><x>34</x><y>227</y><width>131</width><height>31</height></rect></property><property name="text"><string>打开串口</string></property></widget><widget class="QRadioButton" name="radioButton"><property name="geometry"><rect><x>24</x><y>268</y><width>115</width><height>19</height></rect></property><property name="text"><string>ASCII</string></property></widget><widget class="QRadioButton" name="radioButton_2"><property name="geometry"><rect><x>124</x><y>268</y><width>61</width><height>19</height></rect></property><property name="text"><string>HEX</string></property></widget><widget class="QCheckBox" name="checkBox"><property name="geometry"><rect><x>24</x><y>298</y><width>161</width><height>19</height></rect></property><property name="text"><string>显示接收数据时间</string></property></widget><widget class="QPushButton" name="pushButton_2"><property name="geometry"><rect><x>34</x><y>328</y><width>131</width><height>31</height></rect></property><property name="text"><string>清空接受</string></property></widget><widget class="QRadioButton" name="radioButton_3"><property name="geometry"><rect><x>24</x><y>381</y><width>110</width><height>19</height></rect></property><property name="text"><string>ASCII</string></property></widget><widget class="QRadioButton" name="radioButton_4"><property name="geometry"><rect><x>123</x><y>381</y><width>61</width><height>19</height></rect></property><property name="text"><string>HEX</string></property></widget><widget class="QCheckBox" name="checkBox_2"><property name="geometry"><rect><x>24</x><y>413</y><width>161</width><height>19</height></rect></property><property name="text"><string>发送新行</string></property></widget><widget class="QCheckBox" name="checkBox_3"><property name="geometry"><rect><x>25</x><y>448</y><width>91</width><height>19</height></rect></property><property name="text"><string>自动发送</string></property></widget><widget class="QLineEdit" name="lineEdit"><property name="geometry"><rect><x>124</x><y>437</y><width>41</width><height>31</height></rect></property></widget><widget class="QLabel" name="label_7"><property name="geometry"><rect><x>37</x><y>498</y><width>111</width><height>16</height></rect></property><property name="text"><string>串口已经关闭</string></property></widget><widget class="QLabel" name="label_8"><property name="geometry"><rect><x>307</x><y>498</y><width>171</width><height>20</height></rect></property><property name="text"><string>TX:0Bytes  RX:0Bytes</string></property></widget><widget class="QLabel" name="label_9"><property name="geometry"><rect><x>687</x><y>498</y><width>51</width><height>20</height></rect></property><property name="text"><string>@V1.0</string></property></widget><widget class="QTextEdit" name="textEdit"><property name="geometry"><rect><x>210</x><y>11</y><width>580</width><height>351</height></rect></property></widget><widget class="QTextEdit" name="textEdit_2"><property name="geometry"><rect><x>213</x><y>381</y><width>471</width><height>101</height></rect></property></widget><widget class="QPushButton" name="pushButton_3"><property name="geometry"><rect><x>692</x><y>410</y><width>90</width><height>41</height></rect></property><property name="text"><string>发送</string></property></widget><widget class="QGroupBox" name="groupBox"><property name="geometry"><rect><x>10</x><y>10</y><width>191</width><height>471</height></rect></property><property name="title"><string/></property><widget class="QLabel" name="label_6"><property name="geometry"><rect><x>159</x><y>438</y><width>21</width><height>16</height></rect></property><property name="text"><string>s</string></property></widget><widget class="QSplitter" name="splitter"><property name="geometry"><rect><x>10</x><y>0</y><width>51</width><height>201</height></rect></property><property name="orientation"><enum>Qt::Vertical</enum></property><widget class="QLabel" name="label"><property name="text"><string>串口 :</string></property></widget><widget class="QLabel" name="label_2"><property name="text"><string>波特率:</string></property></widget><widget class="QLabel" name="label_3"><property name="text"><string>数据位:</string></property></widget><widget class="QLabel" name="label_4"><property name="text"><string>校验位:</string></property></widget><widget class="QLabel" name="label_5"><property name="text"><string>停止位:</string></property></widget></widget><widget class="QComboBox" name="comboBox_4"><property name="geometry"><rect><x>76</x><y>130</y><width>87</width><height>21</height></rect></property></widget></widget><zorder>groupBox</zorder><zorder>label</zorder><zorder>label_2</zorder><zorder>label_3</zorder><zorder>label_4</zorder><zorder>label_5</zorder><zorder>comboBox</zorder><zorder>comboBox_2</zorder><zorder>comboBox_3</zorder><zorder>comboBox_5</zorder><zorder>pushButton</zorder><zorder>radioButton</zorder><zorder>radioButton_2</zorder><zorder>checkBox</zorder><zorder>pushButton_2</zorder><zorder>radioButton_3</zorder><zorder>radioButton_4</zorder><zorder>checkBox_2</zorder><zorder>checkBox_3</zorder><zorder>lineEdit</zorder><zorder>label_7</zorder><zorder>label_8</zorder><zorder>label_9</zorder><zorder>textEdit</zorder><zorder>textEdit_2</zorder><zorder>pushButton_3</zorder></widget></widget><layoutdefault spacing="6" margin="11"/><resources><include location="QtWidgetsApplication.qrc"/></resources><connections/>
</ui>

相关文章:

QT上位机开发(串口界面设计)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 如果上位机要和嵌入式设备进行打交道的话&#xff0c;那么串口可能就是我们遇到的第一个硬件设备。串口的物理接线很简单&#xff0c;基本上就是收…...

k8s之pod

1、pod&#xff1a;k8s中最小的资源管理组件&#xff0c;最小化运行容器化应用的资源管理对象 &#xff08;1&#xff09;pod是一个抽象的概念&#xff0c;可以理解为一个或者多个容器化应用的集合 &#xff08;2&#xff09;一个pod中运行一个容器是最常用的方式 &#xff…...

第二百四十三回 再分享一个Json工具

文章目录 1. 概念介绍2. 分析与比较2.1 分析问题2.2 比较差异 3. 使用方法4. 内容总结 我们在上一章回中介绍了"分享三个使用TextField的细节"相关的内容&#xff0c;本章回中将再 分享一个Json插件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我…...

electron自定义菜单

创建menu.js const { app, Menu } require("electron"); const createMenu () > {const menu [{label: "菜单",submenu: [{label: "新增",click: () > {},}, ],},{label: "关于",submenu: [{label: "新增",click:…...

变量和函数提升(js的问题)

• js解释执行 • 变量和函数提升 变量声明提前&#xff0c;函数声明提前 • 变量声明提前&#xff1a;值停留在本地 • 函数声明提前&#xff1a;整个函数体提前 如果是var赋值声明的函数&#xff0c;变量提前&#xff0c;函数体停留在本地 1、变量提…...

Excel 插件:ASAP Utilities Crack

ASAP Utilities是一款功能强大的 Excel 插件&#xff0c;填补了 Excel 的空白。在过去的 20 年里&#xff0c;我们的加载项已经发展成为世界上最受欢迎的 Microsoft Excel 加载项之一。 ASAP Utilities 中的功能数量&#xff08;300 多个&#xff09;可能看起来有点令人眼花缭乱…...

hyperf 十九 数据库 二 模型

教程&#xff1a;Hyperf 一、命令行 symfony/console-CSDN博客 hypery 十一、命令行-CSDN博客 hyperf console 执行-CSDN博客 根据之前应该能了解到命令行的基本实现&#xff0c;和hyperf中命令行的定义。 1.1 命令初始化 hyperf.php中系统初始化中通过ApplicationFacto…...

使用python快速开发与PDF文档对话的Gemini聊天机器人

检索增强生成(Retrieval-augmented generation&#xff0c;RAG)使得我们可以让大型语言模型(LLMs)访问外部知识库数据(如pdf,word、text等)&#xff0c;从而让人们可以更加方便的通过LLM来学习外部数据的知识。今天我们将利用之前学习到的RAG方法&#xff0c;谷歌Gemini模型和l…...

Spring Cloud Gateway集成Knife4j

1、前提 网关路由能够正常工作。 案例 基于 Spring Cloud Gateway Nacos 实现动态路由拓展的参考地址&#xff1a;Spring Cloud Gateway Nacos 实现动态路由 详细官网案例&#xff1a;https://doc.xiaominfo.com/docs/middleware-sources/spring-cloud-gateway/spring-gatewa…...

Hive10_窗口函数

窗口函数&#xff08;开窗函数&#xff09; 1 相关函数说明 普通的聚合函数聚合的行集是组,开窗函数聚合的行集是窗口。因此,普通的聚合函数每组(Group by)只返回一个值&#xff0c;而开窗函数则可为窗口中的每行都返回一个值。简单理解&#xff0c;就是对查询的结果多出一列…...

ipvsadm命令详解

ipvsadm命令详解 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨一个在Linux系统网络管理中极具威力的命令——ipvsadm&#xff0c;通过详细解析…...

zabbix通过自动发现-配置监控项、触发器(小白教程)

自动发现配置参考链接&#xff08;不小白&#xff0c;不友好&#xff09; zabbix-get介绍 1配置 zabbix server&#xff1a;版本7&#xff08;不影响&#xff09;,IP地址&#xff1a;192.168.0.60zabbix agent&#xff1a;版本agent1&#xff08;不影响&#xff09;&#xff…...

Dockerfile文件介绍

0 Preface/Foreword 0.1 Docker docker用来自制镜像。 1 Introduction 1.1 Dockerfile Dockerfile是用于定义Docker镜像的构建过程&#xff0c;它包含一系列的指令用于安装 软件包、配置环境等操作。 Dockerfile文件的格式如下&#xff1a; FROM base_image RUN apt-get up…...

【PHP】函数array_reduce()使用场景

目录 1.计算数组中所有元素的和 2.计算数组中所有元素的乘积 3.将多个字符串连接在一起 4.对数组中的元素进行逻辑计算 5.取出第一个满足条件的数组&#xff0c;筛选有用数组 6.array_reduce()函数的基本语法&#xff1a; array_reduce 函数通常用于对数组中的元素进行累…...

软件测试基础理论学习-软件测试方法论

软件测试方法论 软件测试的方法应该建立在不同的软件测试类型上&#xff0c;不同的测试类型会存在不同的方法。本文以软件测试中常见的黑盒测试为例&#xff0c;简述常见软件测试方法。 黑盒测试用例设计方法包括等价类划分法、边界值分析法、因果图法、判定表驱动法、正交试…...

Unity 关于点击不同物品移动并触发不同事件

关于点击不同物品触发不同事件 可以实现在界面中点击不同的物体&#xff0c;移动到物品附近位置&#xff0c;然后触发对应的事件。 首先建立一个公共管理的类&#xff1a; public class InteractionObject : MonoBehaviour {private NavMeshAgent PlayerAgent;private bool …...

c++IO库详细介绍

文章目录 前言c IO 类简介1. iostream库iostream 类标准IO对象 2. fstream库fstream 类 3. stringstream库stringstream 类 格式化和控制错误处理 IO对象无拷贝或赋值IO条件状态主要的状态标志检查流状态控制流状态示例 管理输出缓冲主要操作示例 文件输入输出使用文件流对象示…...

海外静态IP和动态IP有什么区别?推荐哪种?

什么是静态ip、动态ip&#xff0c;二者有什么区别&#xff1f;哪种好&#xff1f;关于这个问题&#xff0c;不难发现&#xff0c;在知道、知乎上面的解释有很多&#xff0c;但据小编的发现&#xff0c;这些回答都是关于静态ip和动态ip的专业术语解释&#xff0c;普通非专业人事…...

OpenHarmony从入门到放弃(一)

OpenHarmony从入门到放弃&#xff08;二&#xff09; 一、OpenHarmony的基本概念和特性 OpenHarmony是由开放原子开源基金会孵化及运营的开源项目&#xff0c;其目标是构建一个面向全场景、全连接、全智能的时代的智能终端设备操作系统。 分布式架构 OpenHarmony采用分布式…...

Unity3D UGUI图集打包与动态使用(TexturePacker)

制作图集的好处&#xff1a; 众所周知CPU是用来处理游戏的逻辑运算的&#xff0c;而GPU是用来处理游戏中图像的。在GPU中&#xff0c;我们要绘制一个图像需要提交图片&#xff08;纹理&#xff09;到显存&#xff0c;然后再进行绘制&#xff08;在这个过程中会产生一次DrawCall…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...

向量几何的二元性:叉乘模长与内积投影的深层联系

在数学与物理的空间世界中&#xff0c;向量运算构成了理解几何结构的基石。叉乘&#xff08;外积&#xff09;与点积&#xff08;内积&#xff09;作为向量代数的两大支柱&#xff0c;表面上呈现出截然不同的几何意义与代数形式&#xff0c;却在深层次上揭示了向量间相互作用的…...

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...