最详细编写上位机教程-飞外网

嵌入式开发,基本都会用到有一些上位机工具,比如串口助手就是最常用的工具之一。

那么,今天分享有一篇由ZhengN整理的用Qt写的简单上位机教程。

一、前言

大家好,我是ZhengN,本次来教大家编写一个基于QT的简单的上位机。

学习一个新的东西我们都从最基础地实例开始,比如学习C语言我们会从编写一个hello程序开始、学习嵌入式我们从点灯开始。

同样的,我们也从编写一个简单的基于QT的上位机来体会体会上位机开发及认识认识QT。

我们本次实现的上位机的功能很简单:上位机通过串口来控制开发板上的一个LED的亮灭。界面如:

二、QT环境搭建

在开始编写上位机之前我们先来一起搭建一下QT开发环境(不然就不是手把手了,哈哈)。往期推文 QT | 详解Qt的几种开发方式 中有介绍到QT的两种开发环境:

使用VS + QT

使用Qt Creator

这里我们选择直接使用QT_Creator的方式。

Qt Creator是一个用于Qt开发的轻量级跨平台集成开发环境。

Qt Creator可带来两大关键益处:

提供首个专为支持跨平台开发而设计的集成开发环境 (IDE),并确保首次接触Qt框架的开发人员能迅速上手和操作。

即使不开发Qt应用程序,Qt Creator也是一个简单易用且功能强大的IDE。

下面我们来一起安装Qt Creator。

1、注册qt账号

我们需要先注册一个QT账号,后面安装Qt Creator的时候会用到。

2、QT_Creator并安装

我们在Windows上进行开发,安装Windows版本的Qt Creator。

得到qt-opensource-windows-x86-5.11.3.exe。然后双击安装,第二步需要输入账号密码,把我们上面注册好的账号密码填入即可。

接下来还需要选择安装组件,根据自己需要进行选择安装,我安装的组件如:

安装完成之后我们桌面上并没有Qt Creator的快捷方式,需要自己创建。找到Qt Creator的安装路径,然后把Qt Creator发送到桌面快捷方式即可。如:

3、验证QT_Creator是否安装成功

我们创建一个简单的C++工程来验证一下Qt Creator是否安装成功。

Qt Creator搭建好之后我们接下来开始编写我们的上位机。

三、编写一个简单的上位机

编写这个简单的上位机我们需要经过一下几个步骤:

上位机界面设计。

上位机逻辑代码编写。

添加上位机图标。

上位机程序的打包。

上位机测试验证。

1、新建一个serial_led工程

这里需要注意的一点是:工程名及工程路径不要有中文字符。

另外,QT中有三种基类,这里我们选择QWidget类。QT的三个基类如:

QMainWindow类:提供一个带有菜单条,工具条和一个状态条的主应用程序窗口。

QWidget类:所有用户界面对象的基类,窗口部件是用户界面的一个基本单元,它从窗口系统接收鼠标,键盘和其他消息,并在屏幕上绘制自己。

QDialog类:对话框窗口的基类,对话框窗口主要用于短期任务和用户进行短期通讯的顶级窗口,QDialog可以是模态对话框或者是非模态对话框。

我们创建的工程如:

其中,项目文件.pro文件是用来告诉qmake关于为这个应用程序创建makefile所需要的细节。例如,一个源文件和头文件的列表、任何应用程序特定配置。例如,一个必需链接的额外库或者一个额外的包含路径、都应该放到项目文件中。

2、上位机界面设计

Qt 一个可视化的界面设计工具:Qt 设计器(Qt Designer)。我们双击.ui文件就可以进入Qt Designer,在Qt Designer中我们可以通过拖动控件的方式来设计我们的界面,整个界面如:

我们从左侧的控件区把我们需要的控件拖动到界面编辑区中,我们这个简单地上位机用到的控件如:

这里需要注意的是波特率这个下拉框需要双击设置一些备选配置,如:

大家可以在左边地控件区找到这三种控件拖动到界面编辑器进行修改、布局即可。

其中,布局可通过如下组件调整:

这几个组件的功能如:

具体地用法大家可以自己去实操一下。

另外,我们需要给我们使用的控件重新命名,在右侧的对象管理区进行操作。命名为有意义的名字,因为后面编写代码会用到。有意义的名字利于编写易懂的代码。比如我们修改的名字如:

最后,控件的属性可根据需要在属性区进行调整。

3、上位机逻辑代码编写

(1)添加串口库、包含串口相关头文件

在serial_led.pro文件添加串口库:

QT += core gui serialport

在widget.h文件包含串口头文件:

#include 《QSerialPort》

#include 《QSerialPortInfo》

QSerialPort 类提供了操作串口的各种接口。

QSerialPortInfo 是一个辅助类,可以提供计算机中可用串口的各种信息。

(2)添加QSerialPort成员

在widget.h的Widget类中添加一个QSerialPort成员:

(3)创建串口对象、搜索所有可用串口

在Widget构造函数中创建一个串口对象并搜索所有可用串口:

Widget::Widget(QWidget *parent) :

QWidget(parent),

ui(new Ui::Widget)

{

QStringList serialNamePort;

ui-》setupUi(this);

this-》setWindowTitle(“serial_led”);

/* 创建一个串口对象 */

serialPort = new QSerialPort(this);

/* 搜索所有可用串口 */

foreach (const QSerialPortInfo &inf0, QSerialPortInfo::availablePorts()) {

serialNamePort《《inf0.portName();

}

ui-》serialBox-》addItems(serialNamePort);

}

(4)编写“打开串口”槽函数

信号和槽是用于对象之间的通信,它是Qt的核心机制。

当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。如果有对象对这个信号感兴趣,想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。

这里,我们点击打开串口按钮会发出clicked信号,此时对应槽函数on_openButton_clicked会被调用。下面我们来实现这个槽函数:

void Widget::on_openButton_clicked()

{

/* 串口设置 */

serialPort-》setPortName(ui-》serialBox-》currentText());

serialPort-》setBaudRate(ui-》baudrateBox-》currentText().toInt());

serialPort-》setDataBits(QSerialPort::Data8);

serialPort-》setStopBits(QSerialPort::OneStop);

serialPort-》setParity(QSerialPort::NoParity);

/* 打开串口提示框 */

if (true == serialPort-》open(QIODevice::ReadWrite))

{

QMessageBox::information(this, “提示”, “串口打开成功”);

}

else

{

QMessageBox::critical(this, “提示”, “串口打开失败”);

}

}

这里我们写死数据位、停止位、求校验位;增加提示框。其中使用QMessageBox需要包含如下头文件:

#include 《QMessageBox》

(5)编写“关闭串口”、“点灯”、“灭灯”槽函数

按照上面打开串口槽函数的方法编写关闭串口、点灯、灭灯槽函数:

void Widget::on_closeButton_clicked()

{

serialPort-》close();

}

void Widget::on_onButton_clicked()

{

serialPort-》write(“ON

”);

qDebug(“ON

”);

}

void Widget::on_offButton_clicked()

{

serialPort-》write(“OFF

”);

qDebug(“OFF

”);

}

以上就是上位机逻辑代码的编写。

4、添加上位机图标

在网上找一个相关的.ico后缀的图标放到我们的工程路径下,如:

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

RC_ICONS = led.ico

5、上位机程序打包

我们上面运行的上位机都是在Qt Creator中编译运行的,如果我们需要把编写好的可执行文件发送给别人使用的话还需要进行打包。

上面我们的工程是Debug版本的:

打包之前,我们先把工程修改为Release版本:

然后在我们工程目录下得到:

此时,双击release文件夹下的serial_led.exe文件是会报错的,报错原因是找不到一些相关的动态库:

我们新建一个文件夹保存我们的打包文件,如:

把build-serial_led-Desktop_Qt_5_11_1_MinGW_32bit-Release elease路径下的serial_led.exe文件拷贝至serial_led_packet文件夹中:

打开QT for Disktop工具:

执行如下命令进入打包目录:

cd /d D:Qtqt_prjserial_ledserial_led_packet

然后执行如下命令进行打包:

windeployqt serial_led.exe

此时,serial_led_packet文件夹中的serial_led.exe文件就可以双击运行了:

此时就完成了程序的打包。此时我们把这一整个文件夹压缩发送给别人使用了。另外,我们也可以借助一些工具把这些文件打包成一个整体的.exe文件,这里不再介绍。

6、上位机测试验证

上位机我们写好了,接下来编写下位机代码来测试一下。

我们点击上位机的点灯、灭灯按钮,则会通过串口分别发送ON 、OFF ,我们编写下位机代码进行接收,然后操控LED灯即可。

下位机是小熊派IOT开发板,测试代码如:

int main(void)

{

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/* MCU Configuration----------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */

HAL_Init();

/* USER CODE BEGIN Init */

/* USER CODE END Init */

/* Configure the system clock */

SystemClock_Config();

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */

MX_GPIO_Init();

MX_DMA_Init();

MX_USART1_UART_Init();

/* USER CODE BEGIN 2 */

printf(“Welcome to UART1 test!

”);

/* USER CODE END 2 */

/* Infinite loop */

/* USER CODE BEGIN WHILE */

while (1)

{

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

if(HAL_UART_Receive(&huart1, &Rdata, 1, 0)==HAL_OK)

{

if (usart_rx_buf_index 》 USART1_RX_BUF_LEN - 1)

{

usart_rx_buf_index = 0;

}

if (Rdata == 0x0A)

{

if (strcmp((char*)USART1_RX_BUF, “ON”) == 0)

{

HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);

}

else if (strcmp((char*)USART1_RX_BUF, “OFF”) == 0)

{

HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);

}

usart_rx_buf_index = 0;

memset(USART1_RX_BUF, 0, USART1_RX_BUF_LEN);

}

else

{

USART1_RX_BUF[usart_rx_buf_index++] = Rdata;

}

}

}

/* USER CODE END 3 */

}

演示如文章开头所见。

四、总结

以上就是手把手教你编写一个简单的点灯上位机的内容,虽然实现的功能很简单,但是QT上位机开发的步骤基本就是这些步骤,通过这个基础实例把这些套路摸透我们就可以接着进行后续更多QT程序地开发学习了。
编辑:lyn


求助,要利用ch341A开发一个上位机软件,来读写spiflash 要用C#开发一个上位机软件,来读写spiflash.利用ch341A ,... 发表于 06-28 07:54 •
PLC和上位机组态软件不在同一个地方,那PLC如何远程和上位机通讯呢。现在物联网技术快速发展,PLC.... PLC远程通讯 发表于 06-27 08:05 • 215次
笙泉科技8051系列U1编程器上位机配套硬件 笙泉科技8051系列U1编程器上位机 配套硬件免费。 发表于 06-21 15:08 •
QtSwissArmyKnife跨平台调试工具 ./oschina_soft/gitee-QtSwissArmyKnife.zip 发表于 06-17 14:43 •
摘要:逛github时看到这个QT的串口示波器,完全开源,支持串口、TCP、波形显示、通信协议。感觉.... 凡亿PCB 发表于 06-12 15:34 • 457次
在QT上构建ffmpeg环境实现音频的解码 在QT上构建ffmpeg环境,实现音频的解码 发表于 06-09 09:05 •
551做自定义键盘方案,电脑配置工具改键值,求程序代码? 551做自定义键盘方案,电脑配置工具改键值,求程序代码。... 发表于 06-08 06:20 • 137次
Qt开发实现SCARA机械手正反解的建立 今天,正运动小助手给大家分享一下EtherCAT运动控制卡开发教程之Qt,主要介绍一下SCARA机械.... 发表于 06-02 15:20 •
嵌入式Qt-动手编写并运行自己的第1个ARM-Qt程序 本篇详细介绍了如何自己编写一个Qt程序,如何通过交叉编译,最终放到开发板中执行的过程。 码农爱学习 发表于 06-02 09:06 • 6303次
嵌入式Linux-Qt环境搭建 Qt程序运行测试 本编介绍如何在嵌入式Linux开发板上配置Qt运行环境,并进行Qt程序运行测试。 码农爱学习 发表于 06-01 09:07 • 4084次
fantascene幻梦linux动态壁纸软件 ./oschina_soft/gitee-fantascene-dynamic-wallpaper..... 发表于 05-30 10:56 •
数据无法IN到上位机,求大佬分享CH567批量传输的例程 前期通过客服拿到了CH567的例程,但是由于内容不完整,只有SETUP控制传输的部分内容,并有一些写法存在问题。目前经过查阅... 发表于 05-19 07:41 •
升功率后CAN停止 上位机观测CAN传送的数据,做闭环实验,升低压侧电压,闭环之前CAN就不传数据了,达到闭环电压也没有进闭环(升低压侧电压... 发表于 05-12 22:31 • 3444次
stm32f103通过单片机给上位机输送的信息能满足吗 stm32f103通过USB给上位机传送信息速率大概能达到多少?通过单片机给上位机输送的信息大概需要20~30m/s的速率,stm32f103能满... 发表于 05-11 17:28 • 5663次
FY3200S系列DDS函数信号发生器上位机编写规范 控制指令总体结构采用命令行方式,通信波特率为固定值 9600bps,由PC发出命令,本机解析执行,然.... 发表于 05-11 11:19 •
Linux 系统为应用程序提供了功能强大且容易扩展的 API,但在某些情况下,这还远远不够。与硬件交.... 书生途 发表于 05-11 08:55 • 2538次
USB上位机CyAPI接收数据问题 朋友们好,我用的官网自带的EZ-USB是可以发送接收数据的,但是自己写的上位机通过CyAPI的BulkLoop改的,也是可以接收... 发表于 05-10 11:22 • 5164次
RK1808计算棒的主动模式使用流程分享 一、主动模式流程RK1808计算棒插入上位机后,会被虚拟成网卡设备上位机进行虚拟网卡配置,配置IP为192.168.180.1,保证上位机... 发表于 05-09 17:08 • 2461次
rk1808是通过linux上位机与手机共享网络的方法介绍 1、rk1808通过linux上位机共享网络配置网络1808计算棒插入计算机后,会被虚拟成网卡设备,计算机会自动生成网卡节点eth1。我们需... 发表于 05-09 16:52 • 2380次
NRF24L01无法接收到数据 能够检测到NRF24L01,但是收不到上位机的消息。到底是哪边配置的不对,请大家帮帮我谢谢。 发表于 04-08 20:58 • 3552次
上位机发送FINS UDP命令读写PLC数据 案例简介: 1.掌握使用SocketTool软件发送FINS/UDP命令读写PLC数据。.... 发表于 04-06 14:47 • 116次
利用CAN通信实现电机控制器上位机监控系统 介绍一种利用TMS320F28335的增强型局域控制网,模块(eCAN)实现数据传输,LABVI.... 发表于 04-02 17:38 • 276次
UDSonCAN的BootLoader上位机开发教程 目前,汽车 ECU 的数量越来越多,软件迭代速度越来越快,为解决汽车 ECU 软件在线更新的问题,遵.... 发表于 04-02 17:20 • 153次
在上位机开发中,日志记录是必不可少的,我们可以通过日志记录做日志分析及错误追踪。初学者会采用txt文.... li5236 发表于 03-29 14:12 • 394次
相比大家都听过自动化生产线、自动化办公等词汇,在没有人工干预的情况下,机器可以自己完成各项任务,这大.... Linux爱好者 发表于 03-16 11:13 • 642次
Ubuntu 操作入门 3.1 Ubuntu 下打开终端我们安装的 Ubuntu 是桌面版本,这样我们可以像在 window.... 发表于 01-17 12:14 • 217次
5分钟,使用STM32CubeMX把你的单片机变成优盘 点击上方蓝色字关注我们!哈喽大家好,这里是没什么人爱看的USB系列。USB系列停了几天,今天继续。这.... 发表于 01-14 11:36 •
利用QT 串口通信进行RS232协议开发 QT串口通信协议代码最近在研究用串口通信去发送协议指令控制相机工作,因为是第一次接触串口,期间也是耗.... 发表于 01-14 10:05 • 185次
制作电脑PC遥控器 利用闲置遥控器,制作PC电脑遥控器。找一个家里闲置的遥控器。上某宝买一块“红外解码模块”。再买一个带.... 发表于 01-12 20:28 • 215次
QT从零开始作单片机上位机-串口调试助手+波形显示-设计QT串口助手界面,添加主窗口控件 第二章 QT从零开始作单片机上位机-串口调试助手+波形显示目录第二章 QT从零开始作单片机上位机-串.... 发表于 01-12 19:10 • 235次
苹果正面临电源芯片短缺问题 可能影响iPhone 12供应 11月5日消息,据国外媒体报道,知情人士称,苹果公司正面临电源芯片短缺问题。外媒称,电源管理芯片是仅.... 发表于 01-11 10:54 • 155次
Qt ECG Monitor Qt嵌入式床旁心电监护仪项目源码 Qt ECG Monitor是由Qt-UI开发和维护的嵌入式床旁心电监护仪界面项目。项目提供C++/.... 发表于 01-10 11:41 • 173次
创意小发明:DIY小型激光雕刻机-超牛的电子制作 (工作原理,制作过程,注意事项,上位机,C源代码等) 在其他坛子里偶然看到自制激光雕刻机的视频,心痒痒的也想搞一个,为了节省时间我先买了一个开发板,又找了.... 发表于 01-10 09:22 • 863次
电源干扰来源,电源回路的重要性 1.如果对接两个不同的电源来源或者两个ldo输出,可能会产生严重的文博,原因在于,负载功率不稳定,会.... 发表于 01-07 14:58 •